diff --git a/emacs.d/init.el b/emacs.d/init.el
index 4ce04b9..dea72a5 100644
--- a/emacs.d/init.el
+++ b/emacs.d/init.el
@@ -40,8 +40,7 @@
(setq current-dir (file-name-directory (if load-file-name load-file-name "~/.emacs.d/")))
;; Configure customization
- (setq custom-file (expand-file-name "custom.el" current-dir))
- (load custom-file)
+ (setq custom-file null-device)
;; Hide startup message
(setq inhibit-startup-message t)
@@ -49,19 +48,28 @@
;; Configure package
(require 'package)
- (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
- (add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t)
+ (setq package-archives '(("melpa" . "https://melpa.org/packages/")
+ ("melpa-stable" . "https://stable.melpa.org/packages/")
+ ("gnu" . "https://elpa.gnu.org/packages/")
+ ("nongnu" . "https://elpa.nongnu.org/nongnu/")))
+ (customize-set-variable 'package-archive-priorities '(("gnu" . 99)
+ ("nongnu" . 80)
+ ("stable" . 70)
+ ("melpa" . 0)))
+ (when (bound-and-true-p minimal-emacs-package-initialize-and-refresh)
+ ;; Initialize and refresh package contents again if needed
(package-initialize)
-
- (when (not package-archive-contents)
+ (unless package-archive-contents
(package-refresh-contents))
- ;; Configure use-package
- ;; https://github.com/jwiegley/use-package
- (eval-when-compile
- (add-to-list 'load-path "~/.emacs.d/use-package/")
- (require 'use-package))
+ ;; Install use-package if necessary
+ (unless (package-installed-p 'use-package)
+ (package-install 'use-package))
+
+ ;; Ensure use-package is available at compile time
(setq use-package-always-ensure t)
+ (eval-when-compile
+ (require 'use-package)))
;; Disable backup files and auto-saving
(setq backup-inhibited t
@@ -100,6 +108,11 @@
history-length 1000)
(savehist-mode 1)
+ ;; Resolve symlinks when opening files, so that any operations are conducted
+ ;; from the file's true directory (like `find-file').
+ (setq find-file-visit-truename t
+ vc-follow-symlinks t)
+
;; smart tab behavior - indent or complete
(setq tab-always-indent 'complete))
@@ -119,10 +132,6 @@
;; -- Theme/Style setup --
(progn
- (use-package monokai-theme
- :config
- (load-theme 'monokai t))
-
;; Enable global line numbers
(global-display-line-numbers-mode t)
@@ -140,6 +149,14 @@
:config
(global-centered-cursor-mode))
+ (use-package doom-themes
+ :ensure t
+ :config
+ ;; Global settings (defaults)
+ (setq doom-themes-enable-bold t ; if nil, bold is universally disabled
+ doom-themes-enable-italic t) ; if nil, italics is universally disabled
+ (load-theme 'doom-tokyo-night t))
+
;; Enable doom-modeline
;; https://seagle0128.github.io/doom-modeline/
(use-package doom-modeline
@@ -303,7 +320,7 @@
(add-hook 'before-save-hook
'whitespace-cleanup)
-
+
(use-package lsp-mode
:config
(setq lsp-enable-file-watchers nil)
@@ -325,10 +342,10 @@
(setq read-process-output-max (* 1024 1024)) ;; 1MB
(setq lsp-idle-delay 0.5)
:hook ((rust-mode . lsp)
- (rust-ts-mode . lsp)
- (python-mode . lsp)
- (python-ts-mode . lsp)
- (lsp-mode . lsp-enable-which-key-integration))
+ (rust-ts-mode . lsp)
+ (python-mode . lsp)
+ (python-ts-mode . lsp)
+ (lsp-mode . lsp-enable-which-key-integration))
:commands lsp)
(use-package lsp-ui
@@ -348,8 +365,6 @@
:commands helm-lsp-workspace-symbol)
(use-package wgrep-ag)
- (use-package quelpa)
- (use-package quelpa-use-package)
(use-package ellama
:ensure t
@@ -362,19 +377,18 @@
:chat-model "deepseek-coder:6.7b" :embedding-model "deepseek-coder:6.7b")))
(use-package copilot
- :quelpa (copilot :fetcher github
- :repo "copilot-emacs/copilot.el"
- :branch "main"
- :files ("dist" "*.el"))
+ :vc (:url "https://github.com/copilot-emacs/copilot.el"
+ :rev :newest
+ :branch "main")
:init
(add-hook 'prog-mode-hook 'copilot-mode))
(use-package treesit-auto
- :custom
- (treesit-auto-install 'prompt)
- :config
- (treesit-auto-add-to-auto-mode-alist 'all)
- (global-treesit-auto-mode))
+ :custom
+ (treesit-auto-install 'prompt)
+ :config
+ (treesit-auto-add-to-auto-mode-alist 'all)
+ (global-treesit-auto-mode))
;; ;; Turn `C-]' into a sticky "super" modifier.
(define-key local-function-key-map [?\C-\]] 'event-apply-super-modifier)
diff --git a/emacs.d/layers/python/init.el b/emacs.d/layers/python/init.el
index 89f8ad4..e809362 100644
--- a/emacs.d/layers/python/init.el
+++ b/emacs.d/layers/python/init.el
@@ -2,7 +2,9 @@
(use-package lsp-pyright
:defer t
:ensure t
- :init (setq lsp-pyright-auto-import-completions t)
+ :init
+ (setq lsp-pyright-auto-import-completions t)
+ (setq lsp-pyright-langserver-command "basedpyright")
:hook (python-mode . (lambda ()
(require 'lsp-pyright)
(lsp)))) ; or lsp-deferred
diff --git a/emacs.d/layers/rust/init.el b/emacs.d/layers/rust/init.el
index 75cc3f7..1394a82 100644
--- a/emacs.d/layers/rust/init.el
+++ b/emacs.d/layers/rust/init.el
@@ -1,5 +1,6 @@
(use-package rust-mode
- :diminish rust-ts-mode
- :ensure t
- :init
- (setq rust-format-on-save t))
+ :diminish rust-ts-mode
+ :ensure t
+ :init
+ (setq rust-mode-treesitter-derive t)
+ (setq rust-format-on-save t))
diff --git a/emacs.d/layers/xit/init.el b/emacs.d/layers/xit/init.el
deleted file mode 100644
index 1ad7943..0000000
--- a/emacs.d/layers/xit/init.el
+++ /dev/null
@@ -1,7 +0,0 @@
- ;; Enable xit-mode
- ;; https://github.com/ryanolsonx/xit-mode/
- ;; https://xit.jotaen.net/
- (load "~/.emacs.d/vendor/xit-mode.el")
- (add-hook 'xit-mode-hook
- '(lambda ()
- (setq tab-width 4)))
diff --git a/emacs.d/use-package/.dir-locals.el b/emacs.d/use-package/.dir-locals.el
deleted file mode 100644
index f14d1c4..0000000
--- a/emacs.d/use-package/.dir-locals.el
+++ /dev/null
@@ -1,8 +0,0 @@
-;;; Directory Local Variables -*- no-byte-compile: t; -*-
-;;; For more information see (info "(emacs) Directory Variables")
-
-((nil . ((sentence-end-double-space . t)
- (emacs-lisp-docstring-fill-column . 65)
- (fill-column . 70)))
- (emacs-lisp-mode . ((indent-tabs-mode . nil)))
- (lisp-data-mode . ((indent-tabs-mode . nil))))
diff --git a/emacs.d/use-package/.elpaignore b/emacs.d/use-package/.elpaignore
deleted file mode 100644
index 6b1d0bf..0000000
--- a/emacs.d/use-package/.elpaignore
+++ /dev/null
@@ -1 +0,0 @@
-LICENSE
diff --git a/emacs.d/use-package/.github/workflows/test.yml b/emacs.d/use-package/.github/workflows/test.yml
deleted file mode 100644
index e5ecf99..0000000
--- a/emacs.d/use-package/.github/workflows/test.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-## test.yml
-
-name: Main workflow
-on: [push, pull_request]
-permissions: {}
-
-jobs:
- build:
- runs-on: ubuntu-latest
- strategy:
- matrix:
- emacs_version:
- - 24.3
- - 24.4
- - 24.5
- - 25.1
- - 25.3
- - 26.1
- - 26.2
- - 26.3
- - 27.1
- - 27.2
- - 28.1
- - 28.2
- - snapshot
- include:
- - emacs_version: 'snapshot'
- allow_failure: true
- steps:
- - uses: actions/checkout@v3
- with:
- persist-credentials: false
-
- - name: Install Emacs
- uses: purcell/setup-emacs@master
- with:
- version: ${{ matrix.emacs_version }}
-
- - name: Run tests
- if: matrix.allow_failure != true
- run: 'make && make test'
-
- - name: Run tests (allow failure)
- if: matrix.allow_failure == true
- run: 'make && make test || true'
diff --git a/emacs.d/use-package/.gitignore b/emacs.d/use-package/.gitignore
deleted file mode 100644
index e60ccbe..0000000
--- a/emacs.d/use-package/.gitignore
+++ /dev/null
@@ -1,12 +0,0 @@
-*~
-/*-autoloads.el
-/*.elc
-/*.html
-/*.info
-/*.pdf
-/config.mk
-/dir
-/doc/content/*
-/stats/
-/use-package/
-.dir-locals-2.el
diff --git a/emacs.d/use-package/LICENSE b/emacs.d/use-package/LICENSE
deleted file mode 100644
index e72bfdd..0000000
--- a/emacs.d/use-package/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- Copyright (C)
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-.
\ No newline at end of file
diff --git a/emacs.d/use-package/Makefile b/emacs.d/use-package/Makefile
deleted file mode 100644
index 075a396..0000000
--- a/emacs.d/use-package/Makefile
+++ /dev/null
@@ -1,171 +0,0 @@
--include config.mk
-include default.mk
-
-## ###################################################################
-
-.PHONY: install install-lisp install-docs install-info \
- test test-interactive use-package \
- clean clean-lisp clean-docs clean-archives \
- stats bump-version melpa-post-release \
- dist use-package-$(VERSION).tar.gz
-
-all: elc docs
-
-help:
- $(info )
- $(info Current version: use-package-$(VERSION))
- $(info )
- $(info See default.mk for variables you might want to set.)
- $(info )
- $(info Build)
- $(info =====)
- $(info )
- $(info make [all] - compile elisp and documentation)
- $(info make elc - compile elisp)
- $(info make docs - generate info manuals)
- $(info make info - generate info manuals)
- $(info make html - generate html manual files)
- $(info make html-dir - generate html manual directories)
- $(info make pdf - generate pdf manuals)
- $(info )
- $(info Install)
- $(info =======)
- $(info )
- $(info make install - install elisp and documentation)
- $(info make install-lisp - install elisp)
- $(info make install-docs - install all documentation)
- $(info make install-info - install info manuals only)
- $(info )
- $(info Clean)
- $(info ====)
- $(info )
- $(info make clean - clean elisp, documentation and tarball)
- $(info make clean-lisp - clean elisp)
- $(info make clean-docs - clean docs)
- $(info make clean-archives - clean release tarball)
- $(info make clean-all - clean everything)
- $(info make clean-stats - clean stats)
- $(info )
- $(info Test)
- $(info ====)
- $(info )
- $(info make test - run tests)
- $(info make test-interactive - run tests interactively)
- $(info make emacs-Q - run emacs -Q plus Use-Package)
- $(info )
- $(info Release Management)
- $(info ==================)
- $(info )
- $(info make stats - regenerate statistics)
- $(info make authors - regenerate AUTHORS.md)
- $(info make preview-stats - preview statistics)
- $(info make publish-stats - publish statistics)
- $(info make preview-manuals - preview manuals)
- $(info make publish-manuals - publish manuals)
- $(info make dist - create tarballs)
- @printf "\n"
-
-## Build #############################################################
-
-elc:
- @$(MAKE) -f Makefile.lisp lisp
-
-docs:
- @$(MAKE) -f Makefile.doc all
-
-info:
- @$(MAKE) -f Makefile.doc info
-
-html:
- @$(MAKE) -f Makefile.doc html
-
-html-dir:
- @$(MAKE) -f Makefile.doc html-dir
-
-pdf:
- @$(MAKE) -f Makefile.doc pdf
-
-## Install ###########################################################
-
-install: install-lisp install-docs
-
-install-lisp:
- @$(MAKE) -f Makefile.lisp install
-
-install-docs: docs
- @$(MAKE) -f Makefile.doc install-docs
-
-install-info: info
- @$(MAKE) -f Makefile.doc install-info
-
-## Test ##############################################################
-
-test:
- @$(BATCH) --eval "(progn\
- (load-file \"use-package-tests.el\")\
- (ert-run-tests-batch-and-exit))"
-
-test-interactive:
- @$(EMACS) -Q $(LOAD_PATH) --eval "(progn\
- (load-file \"use-package-tests.el\")\
- (ert t))"
-
-emacs-Q: clean-lisp
- @$(EMACS) -Q $(LOAD_PATH) --debug-init --eval "(progn\
- (setq debug-on-error t)\
- (require 'use-package))"
-
-## Clean #############################################################
-
-clean: clean-lisp clean-docs clean-archives
- @printf "Cleaning...\n"
- @$(RM) *.elc $(ELGS) # temporary cleanup kludge
- @$(RM) *.texi~ *.info*
-
-clean-lisp:
- @$(MAKE) -f Makefile.lisp clean
-
-clean-docs:
- @$(MAKE) -f Makefile.doc clean
-
-clean-archives:
- @$(RM) *.tar.gz *.tar
- @$(RMDIR) use-package-$(VERSION)
-
-clean-all: clean clean-stats
-
-clean-stats:
- @$(RMDIR) $(statsdir)
-
-## Release management ################################################
-
-stats:
- @$(MAKE) -f Makefile.doc stats
-
-authors:
- @$(MAKE) -f Makefile.doc authors
-
-preview-stats:
- @$(MAKE) -f Makefile.doc preview-stats
-
-publish-stats:
- @$(MAKE) -f Makefile.doc publish-stats
-
-preview-manuals:
- @$(MAKE) -f Makefile.doc preview-manuals
-
-publish-manuals:
- @$(MAKE) -f Makefile.doc publish-manuals
-
-dist: use-package-$(VERSION).tar.gz
-
-DIST_ROOT_FILES = COPYING default.mk Makefile README.md
-DIST_LISP_FILES = $(ELS) Makefile.lisp
-DIST_DOCS_FILES = $(TEXIPAGES) AUTHORS.md Makefile.doc
-
-use-package-$(VERSION).tar.gz: lisp info
- @printf "Packing $@\n"
- @$(MKDIR) use-package-$(VERSION)
- @$(CP) $(DIST_ROOT_FILES) use-package-$(VERSION)
- @$(TAR) cz --mtime=./use-package-$(VERSION) -f use-package-$(VERSION).tar.gz use-package-$(VERSION)
- @$(RMDIR) use-package-$(VERSION)
diff --git a/emacs.d/use-package/Makefile.doc b/emacs.d/use-package/Makefile.doc
deleted file mode 100644
index 43c874f..0000000
--- a/emacs.d/use-package/Makefile.doc
+++ /dev/null
@@ -1,153 +0,0 @@
-# -*- Makefile -*-
-
--include config.mk
-include default.mk
-
-## ###################################################################
-
-.PHONY: install clean AUTHORS.md stats
-
-all: info
-
-## Build #############################################################
-
-info: $(INFOPAGES) dir
-html: $(HTMLFILES)
-pdf: $(PDFFILES)
-
-%.info: %.texi
- @printf "Generating $@\n"
- @$(MAKEINFO) --no-split $< -o $@
-
-dir: use-package.info
- @printf "Generating dir\n"
- @echo $^ | xargs -n 1 $(INSTALL_INFO) --dir=$@
-
-%.html: %.texi
- @printf "Generating $@\n"
- @$(MAKEINFO) --html --no-split $(MANUAL_HTML_ARGS) $<
-
-html-dir: $(TEXIFILES)
- @printf "Generating use-package/*.html\n"
- @$(MAKEINFO) --html $(MANUAL_HTML_ARGS) use-package.texi
-
-%.pdf: %.texi
- @printf "Generating $@\n"
- @texi2pdf --clean $< > /dev/null
-
-## Install ###########################################################
-
-install: install-info install-docs
-
-install-docs: install-info
- @$(MKDIR) $(DESTDIR)$(docdir)
- $(CP) AUTHORS.md $(DESTDIR)$(docdir)
-
-install-info: info
- @$(MKDIR) $(DESTDIR)$(infodir)
- $(CP) $(INFOPAGES) $(DESTDIR)$(infodir)
-
-## Clean #############################################################
-
-clean:
- @printf "Cleaning Documentation/*...\n"
- @$(RMDIR) dir $(INFOPAGES) $(HTMLFILES) $(HTMLDIRS) $(PDFFILES)
-
-## Release management ################################################
-
-stats:
- @printf "Generating statistics\n"
- @gitstats -c style=/assets/stats.css -c max_authors=999 $(TOP) $(statsdir)
-
-authors: AUTHORS.md
-
-AUTHORS.md:
- @printf "Generating AUTHORS.md..."
- @test -e $(TOP).git \
- && (printf "$$AUTHORS_HEADER\n" > $@ \
- && git log --pretty=format:'- %aN <%aE>' | sort -u >> $@ \
- && printf "done\n" ; ) \
- || printf "FAILED (non-fatal)\n"
-
-DOMAIN ?= use-package.vc
-CFRONT_DIST ?= E2LUHBKU1FBV02
-PUBLISH_BUCKET ?= s3://$(DOMAIN)
-PREVIEW_BUCKET ?= s3://preview.$(DOMAIN)
-PUBLISH_URL ?= http://$(DOMAIN).s3-website.eu-central-1.amazonaws.com
-PREVIEW_URL ?= http://preview.$(DOMAIN).s3-website.eu-central-1.amazonaws.com
-
-preview-stats: stats
- @printf "Uploading statistics...\n"
- @aws s3 sync $(statsdir) $(PREVIEW_BUCKET)/stats/
- @aws cloudfront create-invalidation \
- --distribution-id $(CFRONT_DIST) --paths "/stats/*"
- @printf "Uploaded to $(PREVIEW_URL)/stats/\n"
-
-publish-stats: stats
- @printf "Uploading statistics...\n"
- @aws s3 sync $(statsdir) $(PUBLISH_BUCKET)/stats/
- @aws cloudfront create-invalidation \
- --distribution-id $(CFRONT_DIST) --paths "/stats/*"
- @printf "Uploaded to $(PUBLISH_URL)/stats/\n"
-
-preview-manuals: html html-dir pdf
- @printf "Uploading manuals...\n"
- @aws s3 sync use-package $(PREVIEW_BUCKET)/manual/use-package/
- @aws s3 cp use-package.html $(PREVIEW_BUCKET)/manual/
- @aws s3 cp use-package.pdf $(PREVIEW_BUCKET)/manual/
- @aws cloudfront create-invalidation \
- --distribution-id $(CFRONT_DIST) --paths "/manual/*"
- @printf "Uploaded to $(PREVIEW_URL)/manual/\n"
-
-publish-manuals: html html-dir pdf
- @printf "Uploading manuals...\n"
- @aws s3 sync use-package $(PUBLISH_BUCKET)/manual/use-package/
- @aws s3 cp use-package.html $(PUBLISH_BUCKET)/manual/
- @aws s3 cp use-package.pdf $(PUBLISH_BUCKET)/manual/
- @aws cloudfront create-invalidation \
- --distribution-id $(CFRONT_DIST) --paths "/manual/*"
- @printf "Uploaded to $(PUBLISH_URL)/manual/\n"
-
-# Templates ##########################################################
-
-define AUTHORS_HEADER
-Authors
-=======
-
-The following people have contributed to Use-Package.
-
-For statistics see https://magit.vc/stats/authors.html.
-
-Names below are sorted alphabetically.
-
-Author
-------
-
-- Marius Vollmer
-
-Maintainer
-----------
-
-- Jonas Bernoulli
-
-Developers
-----------
-
-- Kyle Meyer
-- Noam Postavsky
-
-Retired Maintainers and Developers
-----------------------------------
-
-- Nicolas Dudebout
-- Peter J. Weisberg
-- Pieter Praet
-- Phil Jackson
-- Rémi Vanicat
-- Yann Hodique
-
-Contributors
-------------
-
-endef
-export AUTHORS_HEADER
diff --git a/emacs.d/use-package/Makefile.lisp b/emacs.d/use-package/Makefile.lisp
deleted file mode 100644
index cac3aad..0000000
--- a/emacs.d/use-package/Makefile.lisp
+++ /dev/null
@@ -1,42 +0,0 @@
-# -*- Makefile -*-
-
--include config.mk
-include default.mk
-
-## ###################################################################
-
-.PHONY: install
-
-all: lisp
-
-## Build order #######################################################
-
-use-package.elc: bind-key.elc
-
-## Build #############################################################
-
-lisp: $(ELCS)
-
-%.elc: %.el
- @printf "Compiling $<\n"
- @$(BATCH) -q --eval "(progn\
- (setq byte-compile-error-on-warn t) \
- (when (file-exists-p \"$@\")\
- (delete-file \"$@\"))\
- (fset 'message* (symbol-function 'message))\
- (fset 'message (lambda (f &rest a)\
- (unless (equal f \"Wrote %s\")\
- (apply 'message* f a)))))" \
- -f batch-byte-compile $<
-
-## Install ###########################################################
-
-install: lisp
- @$(MKDIR) $(DESTDIR)$(lispdir)
- $(CP) $(ELS) $(ELCS) $(DESTDIR)$(lispdir)
-
-## Clean #############################################################
-
-clean:
- @printf "Cleaning lisp...\n"
- $(RM) *.elc $(ELGS)
diff --git a/emacs.d/use-package/NEWS.md b/emacs.d/use-package/NEWS.md
deleted file mode 100644
index c499820..0000000
--- a/emacs.d/use-package/NEWS.md
+++ /dev/null
@@ -1,277 +0,0 @@
-# Changes
-
-## 2.4.4
-
-This release prepares for inclusion to GNU ELPA and includes no other changes
-
-## 2.4.1
-
-This is mostly a bug-fix release:
-
-- Update the documentation for :custom as per #850
-
-- Fix broken test due to #850
-
-- better tests
-
-- add test for #845
-
-- Support keymap symbol in bind-key. Fix #845
-
-- use-package-core.el: use the Emacs set-default function to avoid saving :custom vars twice
-
-- Fix Travis
-
-- typo, should be a vector, not a bytecode object
-
- Solves https://github.com/jwiegley/use-package/issues/842
-
-- Add special value back again, in case needed for backwards compat
-
- I don't know why this special value exists, but perhaps old client code uses it.
-
- The additional `t' in the macro expansion is accidental but not harmful I guess.
-
-- Even when there's no :config, run any pre/post config hooks
-
- i.e., following the existing docs for use-package-inject-hooks, these hooks are
- run:
-
- use-package--foo--pre-config-hook
- use-package--foo--post-config-hook
-
- This should make config customisations more predictable (for example, spacemacs
- uses these hooks extensively to allow 'layers' to be customised).
-
- I got rid of the "special" default value for :config, because it doesn't seem to
- be treated any differently than nil.
-
- Fixes #785
-
-- Clarify the documentation for :after
-
-- add table of contents to README
-
-- Fix typos
-
- Typos found with codespell.
-
-- Fix typos
-
-- Attempt to explain omit "-hook" better
-
-- Update tests
-
-- Switch from `require' to `load' + `featurep'
-
-- Use `require', not `load', when byte-compiling
-
-- Make custom-face evaluate elisp.
-
- Fix #696.
-
-- Add a line of documentation for (use-pacakage ... :hook).
-
-- Fix typo in README
-
-- Fix documentation for defer
-
-- Add no-query option for pdf-tools-install
-
-- Fix typo in README
-
-- Fix all notes in README
-
-- Mention use-package-ensure in README
-
- Without requiring `use-package-ensure`, setting `use-package-always-ensure`
- did not actually work for me.
-
-## 2.4
-
-### Breaking changes
-
-- `use-package` no longer requires `diminish` as a dependency, allowing people
- to decide whether they want to use diminish or delight. This means that if
- you do use diminish, you'll now need to pull it into your configuration
- before any use of the `:diminish` kewyord. For example:
-
- ``` elisp
- (use-package diminish :ensure t)
- ```
-
-- Emacs 24.3 or higher is now a requirement.
-
-- The `:defer-install` keyword has been removed. It may reappear as an add-on
- module for use-package in a future release. See issue #442 for more details.
-
-- There is no longer a `use-package-debug` option, since `use-package-verbose`
- already has the possible value of `debug`.
-
-- The ordering of several elements of `use-package-keywords` have changed; if
- you had previously customized this (or were an extension author adding to
- this list), you may need to rework your changes.
-
-- For extension authors, `:commands` should no longer be propagated down for
- autoloading. See more below.
-
-### Other changes
-
-- Upgrade license to GPL 3.
-
-- If `use-package-verbose` is set to the symbol `debug`, any evaluation errors
- during package configuration will cause a complete report to be written to a
- `*use-package*` buffer, including: the text of the error, the `use-package`
- declaration that caused the error, the post-normalized form of this
- declaration, and the macro-expanded version (without verbosity-related
- code). Note that this still does not help if there are parsing errors, which
- cause Emacs to register a Lisp error at startup time.
-
-- New customization variable `use-package-deferring-keywords`, mainly intended
- for use by extension packages, indicates keywords that, if used without
- `:demand`, cause deferred loading (as if `:defer t` had been specified).
-
-- The `:ensure` keyword now accepts a specific pinning sub-keyword. For
- example:
-
- ``` elisp
- (use-package foo
- :pin "elpa")
- ```
-
- This ensure the package `foo` is installed from `"elpa"`.
-
- ``` elisp
- (use-package foo
- :ensure bar
- :ensure (quux :pin "melpa"))
- ```
-
- This says that `foo` ensures that `bar` is installed, as well as `quux` from
- `"melpa"`. It does *not* ensure that `foo` is installed, because explicit
- `:ensure` keywords were given.
-
-- New `:hook` keyword.
-
-- New `:catch` keyword. If `t` or `nil`, it enables (the default, see
- `use-package-defaults`) or disables catching errors at load time in
- use-package expansions. It can also be a function taking two arguments: the
- keyword being processed at the time the error was encountered, and the error
- object (as generated by `condition-case`).
-
-- New keywords `:custom (foo1 bar1) (foo2 bar2)` etc., and `:custom-face`.
-
- NOTE: These are only for people who wish to keep customizations with their
- accompanying use-package declarations. Functionally, the only benefit over
- using `setq` in a `:config` block is that customizations might execute code
- when values are assigned. If you currently use `M-x customize-option` and
- save to a settings file, you do not want to use this option.
-
-- New `:magic` and `:magic-fallback` keywords.
-
-- New `:defer-install` keyword.
-
-- New customization variable `use-package-enable-imenu-support`.
-
-- New customization variable `use-package-hook-name-suffix`. Any symbols named
- in `:hook`, or in the CAR of cons cells passed to `:hook`, have this text
- appended to them as a convenience. If you find yourself using this keyword
- to add to hooks of different names, or just don't want such appending done,
- you can change the text to an empty string.
-
-- New customization variable `use-package-compute-statistics`, and an
- accompanying command `M-x use-package-report`. See the README for more
- details.
-
-- Allow `:diminish` to take no arguments.
-
-- Support multiple symbols passed to `:after`, and a mini-DSL using `:all` and
- `:any`.
-
-- `:mode` and `:interpreter` can now accept `(rx ...)` forms.
-
-- Using `:load-path` without also using `:ensure` now implies `:ensure nil`.
-
-- `:bind (:map foo-map ...)` now defers binding in the map until the package
- has been loaded.
-
-- Print key bindings for keymaps in `describe-personal-keybindings`.
-
-- When `use-package-inject-hooks` is non-nil, always fire `:init` and
- `:config` hooks.
-
-- Documentation added for the `:after`, `:defer-install`, `:delight`,
- `:requires`, `:when` and `:unless` keywords.
-
-- `:requires SYM` is subtly different from `:if (featurep SYM)`, in that it
- happens before the `:preface`. This means that using `:requires` will cause
- definitions in the `:preface` to not be visible to the byte-compiler,
- leading to possible warnings about unknown functions, or functions that may
- not be available at run-time (which can generally be ignored, since
- `:requires` is intended as a check for basic system functionality; `:after`
- should be used to check for the presence of other modules).
-
-- New undocumented (and currently experimental) keyword `:load` may be used to
- change the name of the actual package loaded, rather than the package name,
- and may even add other names. For example: `(use-package auctex :load
- tex-site)`. This keyword is used internally to generate the `require` for a
- package, so that deferral is simply a matter of not generating this keyword.
-
-- The source code is now broken into several files, so that certain optional
- features (diminish, delight, ensure) may be maintained separately from the
- core functionality.
-
-- When using the `:after` keyword, now even autoloadeds keybinding are
- deferred until after that other package has loaded, in order to allow
- convenient `:bind` to maps only present in that other package. Consider the
- following:
-
- ``` elisp
- (use-package helm-descbinds
- :load-path "site-lisp/helm-descbinds"
- :after helm
- :bind ("C-h b" . helm-descbinds)
- :init
- (fset 'describe-bindings 'helm-descbinds))
- ```
-
- The binding of `C-h b` here will not occur until helm is loaded; and after
- it is loaded, `helm-descbinds` itself is not loaded until the user presses
- `C-h b`.
-
-- For extension authors, if you add a keyword to `use-package-keywords` whose
- presence should indicate deferred loading, please also add it to
- `use-package-deferring-keywords`. Note that this is a bit of a sledgehammer,
- in that the mere presence of these keywords implies deferred loading. For a
- more subtle approach, see the new `use-package-autoloads/` support
- mentioned in the next bullet.
-
-- For extension authors, if you wish deferred loading to possibly occur,
- create functions named `use-package-autoloads/` for each keyword
- that you define, returning an alist of the form `(SYMBOL . TYPE)` of symbols
- to be autoloaded. `SYMBOL` should be an interactive function, and `TYPE` the
- smybol `command`, but this functionality may be extended in future. These
- autoloads are established if deferred loading is to happen.
-
-- If you specify a lambda form rather than a function symbol in any of the
- constructs that *might* introduce autoloads: `:bind`, `:bind*`,
- `:interpreter`, `:mode`, `:magic`, `:magic-fallback`, and `:hook`: then
- deferred loading will no longer be implied, since there's nothing to
- associate an autoload with that could later load the module. In these cases,
- it will be as if you'd specified `:demand t`, in order to ensure the lambda
- form is able to execute in the context of the loaded package.
-
-- For extension authors, there is a new customization variable
- `use-package-merge-key-alist` that specifies how values passed to multiple
- occurrences of the same key should be merged into a single value, during
- normalization of the `use-package` declaration into a proper plist. The
- default behavior is to simply append the values together (since they are
- always normalized to lists).
-
-### Bug fixes
-
-- Repeating a bind no longer causes duplicates in personal-keybindings.
-- When byte-compiling, correctly output declare-function directives.
-- Append to *use-package* when debugging, don't clear it.
-- Don't allow :commands, :bind, etc., to be given an empty list.
-- Explicit :defer t should override use-package-always-demand.
diff --git a/emacs.d/use-package/README.md b/emacs.d/use-package/README.md
deleted file mode 100644
index 7c3308f..0000000
--- a/emacs.d/use-package/README.md
+++ /dev/null
@@ -1,1245 +0,0 @@
-# `use-package`
-
-[](https://gitter.im/use-package/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-[](https://github.com/jwiegley/use-package/actions)
-[](https://elpa.gnu.org/packages/use-package.html)
-
-The `use-package` macro allows you to isolate package configuration in your
-`.emacs` file in a way that is both performance-oriented and, well, tidy. I
-created it because I have over 80 packages that I use in Emacs, and things
-were getting difficult to manage. Yet with this utility my total load time is
-around 2 seconds, with no loss of functionality!
-
-**NOTE**: `use-package` is **not** a package manager! Although `use-package`
-does have the useful capability to interface with package managers (see
-[below](#package-installation)), its primary purpose is for the configuration
-and loading of packages.
-
-- [Installing use-package](#installing-use-package)
-- [Getting started](#getting-started)
-- [Key-binding](#key-binding)
- + [Binding to keymaps](#binding-to-keymaps)
- + [Binding within local keymaps](#binding-within-local-keymaps)
-- [Modes and interpreters](#modes-and-interpreters)
-- [Magic handlers](#magic-handlers)
-- [Hooks](#hooks)
-- [Package customization](#package-customization)
- + [Customizing variables](#customizing-variables)
- + [Customizing faces](#customizing-faces)
-- [Notes about lazy loading](#notes-about-lazy-loading)
-- [Information about package loads](#information-about-package-loads)
-- [Conditional loading](#conditional-loading)
- + [Conditional loading before :preface](#conditional-loading-before-preface)
- + [Loading packages in a sequence](#loading-packages-in-sequence)
- + [Prevent loading if dependencies are missing](#prevent-loading-if-dependencies-are-missing)
-- [Byte compiling your .emacs](#byte-compiling-your-emacs)
- + [Prevent a package from loading at compile-time](#prevent-a-package-from-loading-at-compile-time)
-- [Extending the load-path](#extending-the-load-path)
-- [Catching errors during use-package expansion](#catching-errors-during-use-package-expansion)
-- [Diminishing and delighting minor modes](#diminishing-and-delighting-minor-modes)
-- [Package installation](#package-installation)
- + [Usage with other package managers](#usage-with-other-package-managers)
-- [Gathering Statistics](#gathering-statistics)
-- [Keyword Extensions](#keyword-extensions)
- + [use-package-ensure-system-package](#use-package-ensure-system-package)
- + [use-package-chords](#use-package-chords)
- + [How to create an extension](#how-to-create-an-extension)
- + [First step: Add the keyword](#first-step-add-the-keyword)
- + [Second step: Create a normalizer](#second-step-create-a-normalizer)
- + [Third step: Create a handler](#third-step-create-a-handler)
- + [Fourth step: Test it out](#fourth-step-test-it-out)
-- [Some timing results](#some-timing-results)
-* [Upgrading to 2.x](#upgrading-to-2x)
- + [Semantics of :init is now consistent](#semantics-of-init-is-now-consistent)
- + [:idle has been removed](#idle-has-been-removed)
- + [:defer now accepts an optional numeric argument](#defer-now-accepts-an-optional-numeric-argument)
- + [Add :preface, occurring before everything except :disabled](#add-preface-occurring-before-everything-except-disabled)
- + [Add :functions, for declaring functions to the byte-compiler](#add-functions-for-declaring-functions-to-the-byte-compiler)
- + [use-package.el is no longer needed at runtime](#use-packageel-is-no-longer-needed-at-runtime)
-## Installing use-package
-
-Either clone from this GitHub repository or install from
-[GNU ELPA](https://elpa.gnu.org/) (recommended).
-
-## Getting started
-
-Here is the simplest `use-package` declaration:
-
-``` elisp
-;; This is only needed once, near the top of the file
-(eval-when-compile
- ;; Following line is not needed if use-package.el is in ~/.emacs.d
- (add-to-list 'load-path "")
- (require 'use-package))
-
-(use-package foo)
-```
-
-This loads in the package `foo`, but only if `foo` is available on your
-system. If not, a warning is logged to the `*Messages*` buffer.
-
-Use the `:init` keyword to execute code before a package is loaded. It
-accepts one or more forms, up to the next keyword:
-
-``` elisp
-(use-package foo
- :init
- (setq foo-variable t))
-```
-
-Similarly, `:config` can be used to execute code after a package is loaded.
-In cases where loading is done lazily (see more about autoloading below), this
-execution is deferred until after the autoload occurs:
-
-``` elisp
-(use-package foo
- :init
- (setq foo-variable t)
- :config
- (foo-mode 1))
-```
-
-As you might expect, you can use `:init` and `:config` together:
-
-``` elisp
-(use-package color-moccur
- :commands (isearch-moccur isearch-all)
- :bind (("M-s O" . moccur)
- :map isearch-mode-map
- ("M-o" . isearch-moccur)
- ("M-O" . isearch-moccur-all))
- :init
- (setq isearch-lazy-highlight t)
- :config
- (use-package moccur-edit))
-```
-
-In this case, I want to autoload the commands `isearch-moccur` and
-`isearch-all` from `color-moccur.el`, and bind keys both at the global level
-and within the `isearch-mode-map` (see next section). When the package is
-actually loaded (by using one of these commands), `moccur-edit` is also
-loaded, to allow editing of the `moccur` buffer.
-
-If you autoload non-interactive function, please use `:autoload`.
-
-```elisp
-(use-package org-crypt
- :autoload org-crypt-use-before-save-magic)
-```
-
-## Key-binding
-
-Another common thing to do when loading a module is to bind a key to primary
-commands within that module:
-
-``` elisp
-(use-package ace-jump-mode
- :bind ("C-." . ace-jump-mode))
-```
-
-This does two things: first, it creates an autoload for the `ace-jump-mode`
-command and defers loading of `ace-jump-mode` until you actually use it.
-Second, it binds the key `C-.` to that command. After loading, you can use
-`M-x describe-personal-keybindings` to see all such keybindings you've set
-throughout your `.emacs` file.
-
-A more literal way to do the exact same thing is:
-
-``` elisp
-(use-package ace-jump-mode
- :commands ace-jump-mode
- :init
- (bind-key "C-." 'ace-jump-mode))
-```
-
-When you use the `:commands` keyword, it creates autoloads for those commands
-and defers loading of the module until they are used. Since the `:init` form
-is always run -- even if `ace-jump-mode` might not be on your system --
-remember to restrict `:init` code to only what would succeed either way.
-
-The `:bind` keyword takes either a cons or a list of conses:
-
-``` elisp
-(use-package hi-lock
- :bind (("M-o l" . highlight-lines-matching-regexp)
- ("M-o r" . highlight-regexp)
- ("M-o w" . highlight-phrase)))
-```
-
-The `:commands` keyword likewise takes either a symbol or a list of symbols.
-
-**NOTE**: inside strings, special keys like `tab` or `F1`-`Fn` have to be written inside angle brackets, e.g. `"C-"`.
-Standalone special keys (and some combinations) can be written in square brackets, e.g. `[tab]` instead of `""`. The syntax for the keybindings is similar to
-the "kbd" syntax: see [https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-Rebinding.html](https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-Rebinding.html)
-for more information.
-
-Examples:
-
-``` elisp
-(use-package helm
- :bind (("M-x" . helm-M-x)
- ("M-" . helm-find-files)
- ([f10] . helm-buffers-list)
- ([S-f10] . helm-recentf)))
-```
-
-Furthermore, [remapping commands](https://www.gnu.org/software/emacs/manual/html_node/elisp/Remapping-Commands.html)
-with `:bind` and `bind-key` works as expected, because when the
-binding is a vector, it is passed straight to `define-key`. So the
-following example will rebind `M-q` (originally `fill-paragraph`) to
-`unfill-toggle`:
-
-``` elisp
-(use-package unfill
- :bind ([remap fill-paragraph] . unfill-toggle))
-```
-
-### Binding to keymaps
-
-Normally `:bind` expects that commands are functions that will be autoloaded
-from the given package. However, this does not work if one of those commands
-is actually a keymap, since keymaps are not functions, and cannot be
-autoloaded using Emacs' `autoload` mechanism.
-
-To handle this case, `use-package` offers a special, limited variant of
-`:bind` called `:bind-keymap`. The only difference is that the "commands"
-bound to by `:bind-keymap` must be keymaps defined in the package, rather than
-command functions. This is handled behind the scenes by generating custom code
-that loads the package containing the keymap, and then re-executes your
-keypress after the first load, to reinterpret that keypress as a prefix key.
-
-For example:
-
-``` elisp
-(use-package projectile
- :bind-keymap
- ("C-c p" . projectile-command-map))
-```
-
-### Binding within local keymaps
-
-Slightly different from binding a key to a keymap, is binding a key *within* a
-local keymap that only exists after the package is loaded. `use-package`
-supports this with a `:map` modifier, taking the local keymap to bind to:
-
-``` elisp
-(use-package helm
- :bind (:map helm-command-map
- ("C-c h" . helm-execute-persistent-action)))
-```
-
-The effect of this statement is to wait until `helm` has loaded, and then to
-bind the key `C-c h` to `helm-execute-persistent-action` within Helm's local
-keymap, `helm-command-map`.
-
-Multiple uses of `:map` may be specified. Any binding occurring before the
-first use of `:map` are applied to the global keymap:
-
-``` elisp
-(use-package term
- :bind (("C-c t" . term)
- :map term-mode-map
- ("M-p" . term-send-up)
- ("M-n" . term-send-down)
- :map term-raw-map
- ("M-o" . other-window)
- ("M-p" . term-send-up)
- ("M-n" . term-send-down)))
-```
-### Binding to repeat-maps
-
-A special case of binding within a local keymap is when that keymap is
-used by `repeat-mode`. These keymaps are usually defined specifically
-for this. Using the `:repeat-map` keyword, and passing it a name for
-the map it defines, will bind all following keys inside that map, and
-(by default) set the `repeat-map` property of each bound command to
-that map.
-
-
-This creates a keymap called `git-gutter+-repeat-map`, makes four
-bindings in it as above, then sets the `repeat-map` property of each
-bound command (`git-gutter+-next-hunk` `git-gutter+-previous-hunk`,
-`git-gutter+-stage-hunks` and `git-gutter+-revert-hunk`) to that
-keymap.
-
-``` elisp
-(use-package git-gutter+
- :bind
- (:repeat-map git-gutter+-repeat-map
- ("n" . git-gutter+-next-hunk)
- ("p" . git-gutter+-previous-hunk)
- ("s" . git-gutter+-stage-hunks)
- ("r" . git-gutter+-revert-hunk)))
-```
-
-Specifying `:exit` inside the scope of `:repeat-map` will prevent the
-`repeat-map` property being set, so that the command can be used from
-within the repeat map, but after it using it the repeat map will no
-longer be available. This is useful for commands often used at the end
-of a series of repeated commands:
-
-``` elisp
-(use-package git-gutter+
- :bind
- (:repeat-map my/git-gutter+-repeat-map
- ("n" . git-gutter+-next-hunk)
- ("p" . git-gutter+-previous-hunk)
- ("s" . git-gutter+-stage-hunks)
- ("r" . git-gutter+-revert-hunk)
- :exit
- ("c" . magit-commit-create)
- ("C" . magit-commit)
- ("b" . magit-blame)))
-```
-
-Specifying `:continue` *forces* setting the `repeat-map` property
-(just like *not* specifying `:exit`), so these two snippets are
-equivalent:
-
-``` elisp
-(use-package git-gutter+
- :bind
- (:repeat-map my/git-gutter+-repeat-map
- ("n" . git-gutter+-next-hunk)
- ("p" . git-gutter+-previous-hunk)
- ("s" . git-gutter+-stage-hunks)
- ("r" . git-gutter+-revert-hunk)
- :exit
- ("c" . magit-commit-create)
- ("C" . magit-commit)
- ("b" . magit-blame)))
-```
-
-``` elisp
-(use-package git-gutter+
- :bind
- (:repeat-map my/git-gutter+-repeat-map
- :exit
- ("c" . magit-commit-create)
- ("C" . magit-commit)
- ("b" . magit-blame)
- :continue
- ("n" . git-gutter+-next-hunk)
- ("p" . git-gutter+-previous-hunk)
- ("s" . git-gutter+-stage-hunks)
- ("r" . git-gutter+-revert-hunk)))
-```
-
-
-
-
-## Modes and interpreters
-
-Similar to `:bind`, you can use `:mode` and `:interpreter` to establish a
-deferred binding within the `auto-mode-alist` and `interpreter-mode-alist`
-variables. The specifier to either keyword can be a cons cell, a list of cons
-cells, or a string or regexp:
-
-``` elisp
-(use-package ruby-mode
- :mode "\\.rb\\'"
- :interpreter "ruby")
-
-;; The package is "python" but the mode is "python-mode":
-(use-package python
- :mode ("\\.py\\'" . python-mode)
- :interpreter ("python" . python-mode))
-```
-
-If you aren't using `:commands`, `:bind`, `:bind*`, `:bind-keymap`,
-`:bind-keymap*`, `:mode`, `:interpreter`, or `:hook` (all of which imply `:defer`; see
-the docstring for `use-package` for a brief description of each), you can
-still defer loading with the `:defer` keyword:
-
-``` elisp
-(use-package ace-jump-mode
- :defer t
- :init
- (autoload 'ace-jump-mode "ace-jump-mode" nil t)
- (bind-key "C-." 'ace-jump-mode))
-```
-
-This does exactly the same thing as the following:
-
-``` elisp
-(use-package ace-jump-mode
- :bind ("C-." . ace-jump-mode))
-```
-
-## Magic handlers
-
-Similar to `:mode` and `:interpreter`, you can also use `:magic` and
-`:magic-fallback` to cause certain function to be run if the beginning of a
-file matches a given regular expression. The difference between the two is
-that `:magic-fallback` has a lower priority than `:mode`. For example:
-
-``` elisp
-(use-package pdf-tools
- :load-path "site-lisp/pdf-tools/lisp"
- :magic ("%PDF" . pdf-view-mode)
- :config
- (pdf-tools-install :no-query))
-```
-
-This registers an autoloaded command for `pdf-view-mode`, defers loading of
-`pdf-tools`, and runs `pdf-view-mode` if the beginning of a buffer matches the
-string `"%PDF"`.
-
-## Hooks
-
-The `:hook` keyword allows adding functions onto package hooks. Thus,
-all of the following are equivalent:
-
-``` elisp
-(use-package company
- :hook prog-mode)
-
-(use-package company
- :hook (prog-mode . company-mode))
-
-(use-package company
- :commands company-mode
- :init
- (add-hook 'prog-mode-hook #'company-mode))
-```
-
-And likewise, when multiple hooks should be applied, the following are also
-equivalent:
-
-``` elisp
-(use-package company
- :hook (prog-mode text-mode))
-
-(use-package company
- :hook ((prog-mode text-mode) . company-mode))
-
-(use-package company
- :hook ((prog-mode . company-mode)
- (text-mode . company-mode)))
-
-(use-package company
- :commands company-mode
- :init
- (add-hook 'prog-mode-hook #'company-mode)
- (add-hook 'text-mode-hook #'company-mode))
-```
-
-When using `:hook` omit the "-hook" suffix if you specify the hook
-explicitly, as this is appended by default. For example the following
-code will not work as it attempts to add to the `prog-mode-hook-hook`
-which does not exist:
-
-``` elisp
-;; DOES NOT WORK
-(use-package ace-jump-mode
- :hook (prog-mode-hook . ace-jump-mode))
-```
-
-If you do not like this behaviour, set `use-package-hook-name-suffix`
-to nil. By default the value of this variable is "-hook".
-
-The use of `:hook`, as with `:bind`, `:mode`, `:interpreter`, etc., causes the
-functions being hooked to implicitly be read as `:commands` (meaning they will
-establish interactive `autoload` definitions for that module, if not already
-defined as functions), and so `:defer t` is also implied by `:hook`.
-
-## Package customization
-
-### Customizing variables.
-
-The `:custom` keyword allows customization of package custom variables.
-
-``` elisp
-(use-package comint
- :custom
- (comint-buffer-maximum-size 20000 "Increase comint buffer size.")
- (comint-prompt-read-only t "Make the prompt read only."))
-```
-
-The documentation string is not mandatory.
-
-**NOTE**: these are only for people who wish to keep customizations with their
-accompanying use-package declarations. Functionally, the only benefit over
-using `setq` in a `:config` block is that customizations might execute code
-when values are assigned.
-
-**NOTE**: The customized values are **not** saved in the Emacs `custom-file`.
-Thus you should either use the `:custom` option **or** you should use `M-x
-customize-option` which will save customized values in the Emacs `custom-file`.
-Do not use both.
-
-### Customizing faces
-
-The `:custom-face` keyword allows customization of package custom faces.
-
-``` elisp
-(use-package eruby-mode
- :custom-face
- (eruby-standard-face ((t (:slant italic)))))
-
-(use-package example
- :custom-face
- (example-1-face ((t (:foreground "LightPink"))))
- (example-2-face ((t (:foreground "LightGreen"))) face-defspec-spec))
-
-(use-package zenburn-theme
- :preface
- (setq my/zenburn-colors-alist
- '((fg . "#DCDCCC") (bg . "#1C1C1C") (cyan . "#93E0E3")))
- :custom-face
- (region ((t (:background ,(alist-get my/zenburn-colors-alist 'cyan)))))
- :config
- (load-theme 'zenburn t))
-```
-
-## Notes about lazy loading
-
-The keywords `:commands`, et al, provide "triggers" that cause a package to be
-loaded when certain events occur. However, if `use-package` cannot determine
-that any trigger has been declared, it will load the package immediately (when
-Emacs is starting up) unless `:defer t` is given. The presence of triggers can
-be overridden using `:demand t` to force immediately loading anyway. For
-example, `:hook` represents a trigger that fires when the specified hook is
-run.
-
-In almost all cases you don't need to manually specify `:defer t`, because
-this is implied whenever `:bind` or `:mode` or `:interpreter` are used.
-Typically, you only need to specify `:defer` if you know for a fact that some
-other package will do something to cause your package to load at the
-appropriate time, and thus you would like to defer loading even though
-`use-package` has not created any autoloads for you.
-
-You can override package deferral with the `:demand` keyword. Thus, even if
-you use `:bind`, adding `:demand` will force loading to occur immediately and
-not establish an autoload for the bound key.
-
-## Information about package loads
-
-When a package is loaded, and if you have `use-package-verbose` set to `t`, or
-if the package takes longer than 0.1s to load, you will see a message to
-indicate this loading activity in the `*Messages*` buffer. The same will
-happen for configuration, or `:config` blocks that take longer than 0.1s to
-execute. In general, you should keep `:init` forms as simple and quick as
-possible, and put as much as you can get away with into the `:config` block.
-This way, deferred loading can help your Emacs to start as quickly as
-possible.
-
-Additionally, if an error occurs while initializing or configuring a package,
-this will not stop your Emacs from loading. Rather, the error will be
-captured by `use-package`, and reported to a special `*Warnings*` popup
-buffer, so that you can debug the situation in an otherwise functional Emacs.
-
-## Conditional loading
-
-You can use the `:if` keyword to predicate the loading and initialization of
-modules.
-
-For example, I only want `edit-server` running for my main,
-graphical Emacs, not for other Emacsen I may start at the command line:
-
-``` elisp
-(use-package edit-server
- :if window-system
- :init
- (add-hook 'after-init-hook 'server-start t)
- (add-hook 'after-init-hook 'edit-server-start t))
-```
-In another example, we can load things conditional on the operating system:
-
-``` elisp
-(use-package exec-path-from-shell
- :if (memq window-system '(mac ns))
- :ensure t
- :config
- (exec-path-from-shell-initialize))
-```
-
-The `:disabled` keyword can turn off a module you're having difficulties with,
-or stop loading something you're not using at the present time:
-
-``` elisp
-(use-package ess-site
- :disabled
- :commands R)
-```
-
-When byte-compiling your `.emacs` file, disabled declarations are omitted
-from the output entirely, to accelerate startup times.
-
-**NOTE**: `:when` is provided as an alias for `:if`, and `:unless foo` means
-the same thing as `:if (not foo)`.
-
-### Conditional loading before :preface
-
-If you need to conditionalize a use-package form so that the condition occurs
-before even the `:preface` is executed, simply use `when` around the
-use-package form itself. For example, the following will also stop
-`:ensure` from happening on Mac systems:
-
-``` elisp
-(when (memq window-system '(mac ns))
- (use-package exec-path-from-shell
- :ensure t
- :config
- (exec-path-from-shell-initialize)))
-```
-
-### Loading packages in sequence
-
-Sometimes it only makes sense to configure a package after another has been
-loaded, because certain variables or functions are not in scope until that
-time. This can achieved using an `:after` keyword that allows a fairly rich
-description of the exact conditions when loading should occur. Here is an
-example:
-
-``` elisp
-(use-package hydra
- :load-path "site-lisp/hydra")
-
-(use-package ivy
- :load-path "site-lisp/swiper")
-
-(use-package ivy-hydra
- :after (ivy hydra))
-```
-
-In this case, because all of these packages are demand-loaded in the order
-they occur, the use of `:after` is not strictly necessary. By using it,
-however, the above code becomes order-independent, without an implicit
-depedence on the nature of your init file.
-
-By default, `:after (foo bar)` is the same as `:after (:all foo bar)`, meaning
-that loading of the given package will not happen until both `foo` and `bar`
-have been loaded. Here are some of the other possibilities:
-
-``` elisp
-:after (foo bar)
-:after (:all foo bar)
-:after (:any foo bar)
-:after (:all (:any foo bar) (:any baz quux))
-:after (:any (:all foo bar) (:all baz quux))
-```
-
-When you nest selectors, such as `(:any (:all foo bar) (:all baz quux))`, it
-means that the package will be loaded when either both `foo` and `bar` have
-been loaded, or both `baz` and `quux` have been loaded.
-
-**NOTE**: pay attention if you set `use-package-always-defer` to t, and also use
-the `:after` keyword, as you will need to specify how the declared package is
-to be loaded: e.g., by some `:bind`. If you're not using one of the mechanisms
-that registers autoloads, such as `:bind` or `:hook`, and your package manager
-does not provide autoloads, it's possible that without adding `:demand t` to
-those declarations, your package will never be loaded.
-
-### Prevent loading if dependencies are missing
-
-While the `:after` keyword delays loading until the dependencies are loaded,
-the somewhat simpler `:requires` keyword simply never loads the package if the
-dependencies are not available at the time the `use-package` declaration is
-encountered. By "available" in this context it means that `foo` is available
-if `(featurep 'foo)` evaluates to a non-nil value. For example:
-
-``` elisp
-(use-package abbrev
- :requires foo)
-```
-
-This is the same as:
-
-``` elisp
-(use-package abbrev
- :if (featurep 'foo))
-```
-
-As a convenience, a list of such packages may be specified:
-
-``` elisp
-(use-package abbrev
- :requires (foo bar baz))
-```
-
-For more complex logic, such as that supported by `:after`, simply use `:if`
-and the appropriate Lisp expression.
-
-## Byte-compiling your .emacs
-
-Another feature of `use-package` is that it always loads every file that it
-can when `.emacs` is being byte-compiled. This helps to silence spurious
-warnings about unknown variables and functions.
-
-However, there are times when this is just not enough. For those times, use
-the `:defines` and `:functions` keywords to introduce dummy variable and
-function declarations solely for the sake of the byte-compiler:
-
-``` elisp
-(use-package texinfo
- :defines texinfo-section-list
- :commands texinfo-mode
- :init
- (add-to-list 'auto-mode-alist '("\\.texi$" . texinfo-mode)))
-```
-
-If you need to silence a missing function warning, you can use `:functions`:
-
-``` elisp
-(use-package ruby-mode
- :mode "\\.rb\\'"
- :interpreter "ruby"
- :functions inf-ruby-keys
- :config
- (defun my-ruby-mode-hook ()
- (require 'inf-ruby)
- (inf-ruby-keys))
-
- (add-hook 'ruby-mode-hook 'my-ruby-mode-hook))
-```
-
-### Prevent a package from loading at compile-time
-
-Normally, `use-package` will load each package at compile time before
-compiling the configuration, to ensure that any necessary symbols are in scope
-to satisfy the byte-compiler. At times this can cause problems, since a
-package may have special loading requirements, and all that you want to use
-`use-package` for is to add a configuration to the `eval-after-load` hook. In
-such cases, use the `:no-require` keyword:
-
-``` elisp
-(use-package foo
- :no-require t
- :config
- (message "This is evaluated when `foo' is loaded"))
-```
-
-## Extending the load-path
-
-If your package needs a directory added to the `load-path` in order to load,
-use `:load-path`. This takes a symbol, a function, a string or a list of
-strings. If the path is relative, it is expanded within
-`user-emacs-directory`:
-
-``` elisp
-(use-package ess-site
- :load-path "site-lisp/ess/lisp/"
- :commands R)
-```
-
-**NOTE**: when using a symbol or a function to provide a dynamically generated
-list of paths, you must inform the byte-compiler of this definition so the
-value is available at byte-compilation time. This is done by using the
-special form `eval-and-compile` (as opposed to `eval-when-compile`). Further,
-this value is fixed at whatever was determined during compilation, to avoid
-looking up the same information again on each startup:
-
-``` elisp
-(eval-and-compile
- (defun ess-site-load-path ()
- (shell-command "find ~ -path ess/lisp")))
-
-(use-package ess-site
- :load-path (lambda () (list (ess-site-load-path)))
- :commands R)
-```
-
-## Catching errors during use-package expansion
-
-By default, if `use-package-expand-minimally` is nil (the default),
-use-package will attempts to catch and report errors that occur during
-expansion of use-package declarations in your init file. Setting
-`use-package-expand-minimally` to t completely disables this checking.
-
-This behavior may be overridden locally using the `:catch` keyword. If `t` or
-`nil`, it enables or disables catching errors at load time. It can also be a
-function taking two arguments: the keyword being processed at the time the
-error was encountered, and the error object (as generated by
-`condition-case`). For example:
-
-``` elisp
-(use-package example
- ;; Note that errors are never trapped in the preface, since doing so would
- ;; hide definitions from the byte-compiler.
- :preface (message "I'm here at byte-compile and load time.")
- :init (message "I'm always here at startup")
- :config
- (message "I'm always here after the package is loaded")
- (error "oops")
- ;; Don't try to (require 'example), this is just an example!
- :no-require t
- :catch (lambda (keyword err)
- (message (error-message-string err))))
-```
-
-Evaluating the above form will print these messages:
-
-```
-I’m here at byte-compile and load time.
-I’m always here at startup
-Configuring package example...
-I’m always here after the package is loaded
-oops
-```
-
-## Diminishing and delighting minor modes
-
-`use-package` also provides built-in support for the diminish and
-delight utilities -- if you have them installed. Their purpose is to
-remove or change minor mode strings in your mode-line.
-
-[diminish](https://github.com/myrjola/diminish.el) is invoked with
-the `:diminish` keyword, which is passed either a minor mode symbol, a
-cons of the symbol and its replacement string, or just a replacement
-string, in which case the minor mode symbol is guessed to be the
-package name with "-mode" appended at the end:
-
-``` elisp
-(use-package abbrev
- :diminish abbrev-mode
- :config
- (if (file-exists-p abbrev-file-name)
- (quietly-read-abbrev-file)))
-```
-
-[delight](https://elpa.gnu.org/packages/delight.html) is invoked with
-the `:delight` keyword, which is passed a minor mode symbol, a
-replacement string or
-quoted
-[mode-line data](https://www.gnu.org/software/emacs/manual/html_node/elisp/Mode-Line-Data.html) (in
-which case the minor mode symbol is guessed to be the package name
-with "-mode" appended at the end), both of these, or several lists of
-both. If no arguments are provided, the default mode name is hidden
-completely.
-
-``` elisp
-;; Don't show anything for rainbow-mode.
-(use-package rainbow-mode
- :delight)
-
-;; Don't show anything for auto-revert-mode, which doesn't match
-;; its package name.
-(use-package autorevert
- :delight auto-revert-mode)
-
-;; Remove the mode name for projectile-mode, but show the project name.
-(use-package projectile
- :delight '(:eval (concat " " (projectile-project-name))))
-
-;; Completely hide visual-line-mode and change auto-fill-mode to " AF".
-(use-package emacs
- :delight
- (auto-fill-function " AF")
- (visual-line-mode))
-```
-
-## Package installation
-
-You can use `use-package` to load packages from ELPA with `package.el`. This
-is particularly useful if you share your `.emacs` among several machines; the
-relevant packages are downloaded automatically once declared in your `.emacs`.
-The `:ensure` keyword causes the package(s) to be installed automatically if
-not already present on your system:
-
-``` elisp
-(use-package magit
- :ensure t)
-```
-
-If you need to install a different package from the one named by
-`use-package`, you can specify it like this:
-
-``` elisp
-(use-package tex
- :ensure auctex)
-```
-
-Enable `use-package-always-ensure` if you wish this behavior to be global
-for all packages:
-
-``` elisp
-(require 'use-package-ensure)
-(setq use-package-always-ensure t)
-```
-
-**NOTE**: `:ensure` will install a package if it is not already installed, but
-it does not keep it up-to-date. If you want to keep your packages updated
-automatically, one option is to use
-[auto-package-update](https://github.com/rranelli/auto-package-update.el),
-like
-
-``` elisp
-(use-package auto-package-update
- :config
- (setq auto-package-update-delete-old-versions t)
- (setq auto-package-update-hide-results t)
- (auto-package-update-maybe))
-```
-
-Lastly, when running on Emacs 24.4 or later, use-package can pin a package to
-a specific archive, allowing you to mix and match packages from different
-archives. The primary use-case for this is preferring packages from the
-`gnu` and `melpa-stable` archives, but using specific packages from `melpa`
-when you need to track newer versions than what is available in the `stable`
-archives is also a valid use-case.
-
-By default `package.el` prefers `melpa` over `melpa-stable` due to the
-versioning `(> evil-20141208.623 evil-1.0.9)`, so even if you are tracking
-only a single package from `melpa`, you will need to tag all the non-`melpa`
-packages with the appropriate archive. If this really annoys you, then you can
-set `use-package-always-pin` to set a default.
-
-If you want to manually keep a package updated and ignore upstream updates,
-you can pin it to `manual`, which as long as there is no repository by that
-name, will Just Work(tm).
-
-`use-package` throws an error if you try to pin a package to an archive that
-has not been configured using `package-archives` (apart from the magic
-`manual` archive mentioned above):
-
-```
-Archive 'foo' requested for package 'bar' is not available.
-```
-
-Example:
-
-``` elisp
-(use-package company
- :ensure t
- :pin gnu)
-
-(use-package evil
- :ensure t)
- ;; no :pin needed, as package.el will choose the version in melpa
-
-(use-package adaptive-wrap
- :ensure t
- ;; as this package is available only in the gnu archive, this is
- ;; technically not needed, but it helps to highlight where it
- ;; comes from
- :pin gnu)
-
-(use-package org
- :ensure t
- ;; ignore org-mode from upstream and use a manually installed version
- :pin manual)
-```
-
-**NOTE**: the `:pin` argument has no effect on emacs versions < 24.4.
-
-### Usage with other package managers
-
-By overriding `use-package-ensure-function` and/or
-`use-package-pre-ensure-function`, other package managers can override
-`:ensure` to use them instead of `package.el`. At the present time,
-the only package manager that does this
-is [`straight.el`](https://github.com/raxod502/straight.el).
-
-## Gathering Statistics
-
-If you'd like to see how many packages you've loaded, what stage of
-initialization they've reached, and how much aggregate time they've
-spent (roughly), you can enable `use-package-compute-statistics` after
-loading `use-package` but before any `use-package` forms, and then run
-the command `M-x use-package-report` to see the results. The buffer
-displayed is a tabulated list. You can use `S` in a column to sort the
-rows based on it.
-
-## Keyword Extensions
-
-Starting with version 2.0, `use-package` is based on an extensible
-framework that makes it easy for package authors to add new keywords,
-or modify the behavior of existing keywords.
-
-Some keyword extensions are now included in the `use-package`
-distribution and can be optionally installed.
-
-### `(use-package-ensure-system-package)`
-
-The `:ensure-system-package` keyword allows you to ensure system
-binaries exist alongside your package declarations.
-
-First, you will want to make sure `exec-path` is cognisant of all
-binary package names that you would like to ensure are
-installed. [`exec-path-from-shell`](https://github.com/purcell/exec-path-from-shell)
-is often a good way to do this.
-
-To enable the extension after you've loaded `use-package`:
-
-``` elisp
-(use-package use-package-ensure-system-package
- :ensure t)
-```
-
-Here’s an example of usage:
-
-``` emacs-lisp
-(use-package rg
- :ensure-system-package rg)
-```
-
-This will expect a global binary package to exist called `rg`. If it
-does not, it will use your system package manager (using the package
-[`system-packages`](https://gitlab.com/jabranham/system-packages)) to
-attempt an install of a binary by the same name asynchronously. For
-example, for most `macOS` users this would call: `brew install rg`.
-
-If the package is named differently than the binary, you can use a
-cons in the form of `(binary . package-name)`, i.e.:
-
-``` emacs-lisp
-(use-package rg
- :ensure-system-package
- (rg . ripgrep))
-```
-
-In the previous `macOS` example, this would call: `brew install
-ripgrep` if `rg` was not found.
-
-What if you want to customize the install command further?
-
-``` emacs-lisp
-(use-package tern
- :ensure-system-package (tern . "npm i -g tern"))
-```
-
-`:ensure-system-package` can also take a cons where its `cdr` is a
-string that will get called by `(async-shell-command)` to install if
-it isn’t found.
-
-You may also pass in a list of cons-es:
-
-``` emacs-lisp
-(use-package ruby-mode
- :ensure-system-package
- ((rubocop . "gem install rubocop")
- (ruby-lint . "gem install ruby-lint")
- (ripper-tags . "gem install ripper-tags")
- (pry . "gem install pry")))
-```
-
-Finally, in case the package dependency does not provide a global
-executable, you can ensure packages exist by checking the presence of
-a file path by providing a string like so:
-
-``` emacs-lisp
-(use-package dash-at-point
- :if (eq system-type 'darwin)
- :ensure-system-package
- ("/Applications/Dash.app" . "brew cask install dash"))
-```
-
-`:ensure-system-package` will use `system-packages-install` to install
-system packages, except where a custom command has been specified, in
-which case it will be executed verbatim by `async-shell-command`.
-
-Configuration variables `system-packages-package-manager` and
-`system-packages-use-sudo` will be honoured, but not for custom
-commands. Custom commands should include the call to sudo in the
-command if needed.
-
-### `(use-package-chords)`
-
-The `:chords` keyword allows you to define
-[`key-chord`](http://www.emacswiki.org/emacs/key-chord.el) bindings
-for `use-package` declarations in the same manner as the `:bind`
-keyword.
-
-To enable the extension:
-
-``` elisp
-(use-package use-package-chords
- :ensure t
- :config (key-chord-mode 1))
-```
-
-Then you can define your chord bindings in the same manner as `:bind` using a cons or a list of conses:
-
-``` elisp
-(use-package ace-jump-mode
- :chords (("jj" . ace-jump-char-mode)
- ("jk" . ace-jump-word-mode)
- ("jl" . ace-jump-line-mode)))
-```
-
-### How to create an extension
-
-#### First step: Add the keyword
-
-The first step is to add your keyword at the right place in
-`use-package-keywords`. This list determines the order in which things will
-happen in the expanded code. You should never change this order, but it gives
-you a framework within which to decide when your keyword should fire.
-
-#### Second step: Create a normalizer
-
-Define a normalizer for your keyword by defining a function named after the
-keyword, for example:
-
-``` elisp
-(defun use-package-normalize/:pin (name-symbol keyword args)
- (use-package-only-one (symbol-name keyword) args
- (lambda (label arg)
- (cond
- ((stringp arg) arg)
- ((symbolp arg) (symbol-name arg))
- (t
- (use-package-error
- ":pin wants an archive name (a string)"))))))
-```
-
-The job of the normalizer is take a list of arguments (possibly nil), and turn
-it into the single argument (which could still be a list) that should appear
-in the final property list used by `use-package`.
-
-#### Third step: Create a handler
-
-Once you have a normalizer, you must create a handler for the keyword:
-
-``` elisp
-(defun use-package-handler/:pin (name-symbol keyword archive-name rest state)
- (let ((body (use-package-process-keywords name-symbol rest state)))
- ;; This happens at macro expansion time, not when the expanded code is
- ;; compiled or evaluated.
- (if (null archive-name)
- body
- (use-package-pin-package name-symbol archive-name)
- (use-package-concat
- body
- `((push '(,name-symbol . ,archive-name)
- package-pinned-packages))))))
-```
-
-Handlers can affect the handling of keywords in two ways. First, it can
-modify the `state` plist before recursively processing the remaining keywords,
-to influence keywords that pay attention to the state (one example is the
-state keyword `:deferred`, not to be confused with the `use-package` keyword
-`:defer`). Then, once the remaining keywords have been handled and their
-resulting forms returned, the handler may manipulate, extend, or just ignore
-those forms.
-
-The task of each handler is to return a *list of forms* representing code to
-be inserted. It does not need to be a `progn` list, as this is handled
-automatically in other places. Thus it is very common to see the idiom of
-using `use-package-concat` to add new functionality before or after a code
-body, so that only the minimum code necessary is emitted as the result of a
-`use-package` expansion.
-
-#### Fourth step: Test it out
-
-After the keyword has been inserted into `use-package-keywords`, and a
-normalizer and a handler defined, you can now test it by seeing how usages of
-the keyword will expand. For this, use `M-x pp-macroexpand-last-sexp` with
-the cursor set immediately after the `(use-package ...)` expression.
-
-## Some timing results
-
-On my Retina iMac, the "Mac port" variant of Emacs 24.4 loads in 0.57s, with
-around 218 packages configured (nearly all of them lazy-loaded). However, I
-experience no loss of functionality, just a bit of latency when I'm first
-starting to use Emacs (due to the autoloading). Since I also use idle-loading
-for many packages, perceived latency is typically reduced overall.
-
-On Linux, the same configuration loads in 0.32s.
-
-If I don't use Emacs graphically, I can test the absolute minimum times. This
-is done by running:
-
-``` bash
-time emacs -l init.elc -batch --eval '(message "Hello, world!")'
-```
-
-On the Mac I see an average of 0.36s for the same configuration, and on Linux
-0.26s.
-
-# Upgrading to 2.x
-
-## Semantics of :init is now consistent
-
-The meaning of `:init` has been changed: It now *always* happens before
-package load, whether `:config` has been deferred or not. This means that
-some uses of `:init` in your configuration may need to be changed to `:config`
-(in the non-deferred case). For the deferred case, the behavior is unchanged
-from before.
-
-Also, because `:init` and `:config` now mean "before" and "after", the `:pre-`
-and `:post-` keywords are gone, as they should no longer be necessary.
-
-Lastly, an effort has been made to make your Emacs start even in the presence
-of use-package configuration failures. So after this change, be sure to check
-your `*Messages*` buffer. Most likely, you will have several instances where
-you are using `:init`, but should be using `:config` (this was the case for me
-in a number of places).
-
-## :idle has been removed
-
-I am removing this feature for now because it can result in a nasty
-inconsistency. Consider the following definition:
-
-``` elisp
-(use-package vkill
- :commands vkill
- :idle (some-important-configuration-here)
- :bind ("C-x L" . vkill-and-helm-occur)
- :init
- (defun vkill-and-helm-occur ()
- (interactive)
- (vkill)
- (call-interactively #'helm-occur))
-
- :config
- (setq vkill-show-all-processes t))
-```
-
-If I load my Emacs and wait until the idle timer fires, then this is the
-sequence of events:
-
- :init :idle :config
-
-But if I load Emacs and immediately type C-x L without waiting for the idle
-timer to fire, this is the sequence of events:
-
- :init :config :idle
-
-It's possible that the user could use `featurep` in their idle to test for
-this case, but that's a subtlety I'd rather avoid.
-
-## :defer now accepts an optional numeric argument
-
-`:defer [N]` causes the package to be loaded -- if it has not already been --
-after `N` seconds of idle time.
-
-``` elisp
-(use-package back-button
- :commands (back-button-mode)
- :defer 2
- :init
- (setq back-button-show-toolbar-buttons nil)
- :config
- (back-button-mode 1))
-```
-
-## Add :preface, occurring before everything except :disabled
-
-`:preface` can be used to establish function and variable definitions that
-will 1) make the byte-compiler happy (it won't complain about functions whose
-definitions are unknown because you have them within a guard block), and 2)
-allow you to define code that can be used in an `:if` test.
-
-**NOTE**: whatever is specified within `:preface` is evaluated both at load
-time and at byte-compilation time, in order to ensure that definitions are
-seen by both the Lisp evaluator and the byte-compiler, so you should avoid
-having any side-effects in your preface, and restrict it merely to symbol
-declarations and definitions.
-
-## Add :functions, for declaring functions to the byte-compiler
-
-What `:defines` does for variables, `:functions` does for functions.
-
-## use-package.el is no longer needed at runtime
-
-This means you should put the following at the top of your Emacs, to further
-reduce load time:
-
-``` elisp
-(eval-when-compile
- (require 'use-package))
-(require 'diminish) ;; if you use :diminish
-(require 'bind-key) ;; if you use any :bind variant
-```
diff --git a/emacs.d/use-package/bind-chord.el b/emacs.d/use-package/bind-chord.el
deleted file mode 100644
index ed736a4..0000000
--- a/emacs.d/use-package/bind-chord.el
+++ /dev/null
@@ -1,113 +0,0 @@
-;;; bind-chord.el --- key-chord binding helper for use-package-chords -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2015-2022 Free Software Foundation, Inc.
-
-;; Author: Justin Talbott
-;; Keywords: convenience, tools, extensions
-;; URL: https://github.com/jwiegley/use-package
-;; Version: 0.2.1
-;; Package-Requires: ((emacs "24.3") (bind-key "1.0") (key-chord "0.6"))
-;; Filename: bind-chord.el
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;;; Code:
-
-(require 'bind-key)
-(require 'key-chord nil t)
-
-;;;###autoload
-(defmacro bind-chord (chord command &optional keymap)
- "Bind CHORD to COMMAND in KEYMAP (`global-map' if not passed)."
- (let ((key1 (logand 255 (aref chord 0)))
- (key2 (logand 255 (aref chord 1))))
- (if (eq key1 key2)
- `(bind-key (vector 'key-chord ,key1 ,key2) ,command ,keymap)
- `(progn
- (bind-key (vector 'key-chord ,key1 ,key2) ,command ,keymap)
- (bind-key (vector 'key-chord ,key2 ,key1) ,command ,keymap)))))
-
-(defun bind-chords-form (args keymap)
- "Bind multiple chords at once.
-
-Accepts keyword arguments:
-:map MAP - a keymap into which the keybindings should be
- added
-
-The rest of the arguments are conses of keybinding string and a
-function symbol (unquoted)."
- (let (map pkg)
- (let ((cont t))
- (while (and cont args)
- (if (cond ((eq :map (car args))
- (setq map (cadr args)))
- ((eq :package (car args))
- (setq pkg (cadr args))))
- (setq args (cddr args))
- (setq cont nil))))
-
- (unless map (setq map keymap))
-
- (let (first next)
- (while args
- (if (keywordp (car args))
- (progn
- (setq next args)
- (setq args nil))
- (if first
- (nconc first (list (car args)))
- (setq first (list (car args))))
- (setq args (cdr args))))
-
- (cl-flet
- ((wrap (map bindings)
- (if (and map pkg (not (memq map '(global-map
- override-global-map))))
- `((if (boundp ',map)
- ,(macroexp-progn bindings)
- (eval-after-load
- ,(if (symbolp pkg) `',pkg pkg)
- ',(macroexp-progn bindings))))
- bindings)))
-
- (append
- (wrap map
- (cl-mapcan
- (lambda (form)
- (let ((fun (and (cdr form) (list 'function (cdr form)))))
- (if (and map (not (eq map 'global-map)))
- `((bind-chord ,(car form) ,fun ,map))
- `((bind-chord ,(car form) ,fun nil)))))
- first))
- (when next
- (bind-chords-form (if pkg
- (cons :package (cons pkg next))
- next) map)))))))
-
-;;;###autoload
-(defmacro bind-chords (&rest args)
- "Bind multiple chords at once.
-
-Accepts keyword argument:
-:map - a keymap into which the keybindings should be added
-
-The rest of the arguments are conses of keybinding string and a
-function symbol (unquoted)."
- (macroexp-progn (bind-chords-form args nil)))
-
-(provide 'bind-chord)
-
-;;; bind-chord.el ends here
diff --git a/emacs.d/use-package/bind-key.el b/emacs.d/use-package/bind-key.el
deleted file mode 100644
index 3168f68..0000000
--- a/emacs.d/use-package/bind-key.el
+++ /dev/null
@@ -1,544 +0,0 @@
-;;; bind-key.el --- A simple way to manage personal keybindings -*- lexical-binding: t; -*-
-
-;; Copyright (c) 2012-2022 Free Software Foundation, Inc.
-
-;; Author: John Wiegley
-;; Maintainer: John Wiegley
-;; Created: 16 Jun 2012
-;; Version: 2.4.1
-;; Package-Requires: ((emacs "24.3"))
-;; Keywords: keys keybinding config dotemacs extensions
-;; URL: https://github.com/jwiegley/use-package
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;; If you have lots of keybindings set in your .emacs file, it can be hard to
-;; know which ones you haven't set yet, and which may now be overriding some
-;; new default in a new Emacs version. This module aims to solve that
-;; problem.
-;;
-;; Bind keys as follows in your .emacs:
-;;
-;; (require 'bind-key)
-;;
-;; (bind-key "C-c x" 'my-ctrl-c-x-command)
-;;
-;; If the keybinding argument is a vector, it is passed straight to
-;; `define-key', so remapping a key with `[remap COMMAND]' works as
-;; expected:
-;;
-;; (bind-key [remap original-ctrl-c-x-command] 'my-ctrl-c-x-command)
-;;
-;; If you want the keybinding to override all minor modes that may also bind
-;; the same key, use the `bind-key*' form:
-;;
-;; (bind-key* "" 'other-window)
-;;
-;; If you want to rebind a key only in a particular keymap, use:
-;;
-;; (bind-key "C-c x" 'my-ctrl-c-x-command some-other-mode-map)
-;;
-;; To unbind a key within a keymap (for example, to stop your favorite major
-;; mode from changing a binding that you don't want to override everywhere),
-;; use `unbind-key':
-;;
-;; (unbind-key "C-c x" some-other-mode-map)
-;;
-;; To bind multiple keys at once, or set up a prefix map, a `bind-keys' macro
-;; is provided. It accepts keyword arguments, please see its documentation
-;; for a detailed description.
-;;
-;; To add keys into a specific map, use :map argument
-;;
-;; (bind-keys :map dired-mode-map
-;; ("o" . dired-omit-mode)
-;; ("a" . some-custom-dired-function))
-;;
-;; To set up a prefix map, use `:prefix-map' and `:prefix' arguments (both are
-;; required)
-;;
-;; (bind-keys :prefix-map my-customize-prefix-map
-;; :prefix "C-c c"
-;; ("f" . customize-face)
-;; ("v" . customize-variable))
-;;
-;; You can combine all the keywords together. Additionally,
-;; `:prefix-docstring' can be specified to set documentation of created
-;; `:prefix-map' variable.
-;;
-;; To bind multiple keys in a `bind-key*' way (to be sure that your bindings
-;; will not be overridden by other modes), you may use `bind-keys*' macro:
-;;
-;; (bind-keys*
-;; ("C-o" . other-window)
-;; ("C-M-n" . forward-page)
-;; ("C-M-p" . backward-page))
-;;
-;; After Emacs loads, you can see a summary of all your personal keybindings
-;; currently in effect with this command:
-;;
-;; M-x describe-personal-keybindings
-;;
-;; This display will tell you if you've overridden a default keybinding, and
-;; what the default was. Also, it will tell you if the key was rebound after
-;; your binding it with `bind-key', and what it was rebound it to.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'easy-mmode)
-
-(defgroup bind-key nil
- "A simple way to manage personal keybindings."
- :group 'emacs)
-
-(defcustom bind-key-column-widths '(18 . 40)
- "Width of columns in `describe-personal-keybindings'."
- :type '(cons integer integer)
- :group 'bind-key)
-
-(defcustom bind-key-segregation-regexp
- "\\`\\(\\(C-[chx] \\|M-[gso] \\)\\([CM]-\\)?\\|.+-\\)"
- "Regular expression used to divide key sets in the output from
-\\[describe-personal-keybindings]."
- :type 'regexp
- :group 'bind-key)
-
-(defcustom bind-key-describe-special-forms nil
- "If non-nil, extract docstrings from lambdas, closures and keymaps if possible."
- :type 'boolean
- :group 'bind-key)
-
-;; Create override-global-mode to force key remappings
-
-(defvar override-global-map (make-keymap)
- "Keymap for `override-global-mode'.")
-
-(define-minor-mode override-global-mode
- "A minor mode so that keymap settings override other modes."
- :init-value t
- :lighter "")
-
-;; the keymaps in `emulation-mode-map-alists' take precedence over
-;; `minor-mode-map-alist'
-(add-to-list 'emulation-mode-map-alists
- `((override-global-mode . ,override-global-map)))
-
-(defvar personal-keybindings nil
- "List of bindings performed by `bind-key'.
-
-Elements have the form ((KEY . [MAP]) CMD ORIGINAL-CMD)")
-
-;;;###autoload
-(defmacro bind-key (key-name command &optional keymap predicate)
- "Bind KEY-NAME to COMMAND in KEYMAP (`global-map' if not passed).
-
-KEY-NAME may be a vector, in which case it is passed straight to
-`define-key'. Or it may be a string to be interpreted as
-spelled-out keystrokes, e.g., `C-c C-z'. See documentation of
-`edmacro-mode' for details.
-
-COMMAND must be an interactive function or lambda form.
-
-KEYMAP, if present, should be a keymap variable or symbol.
-For example:
-
- (bind-key \"M-h\" #\\='some-interactive-function my-mode-map)
-
- (bind-key \"M-h\" #\\='some-interactive-function \\='my-mode-map)
-
-If PREDICATE is non-nil, it is a form evaluated to determine when
-a key should be bound. It must return non-nil in such cases.
-Emacs can evaluate this form at any time that it does redisplay
-or operates on menu data structures, so you should write it so it
-can safely be called at any time."
- (let ((namevar (make-symbol "name"))
- (keyvar (make-symbol "key"))
- (kmapvar (make-symbol "kmap"))
- (kdescvar (make-symbol "kdesc"))
- (bindingvar (make-symbol "binding")))
- `(let* ((,namevar ,key-name)
- (,keyvar ,(if (stringp key-name) (read-kbd-macro key-name)
- `(if (vectorp ,namevar) ,namevar
- (read-kbd-macro ,namevar))))
- (,kmapvar (or (if (and ,keymap (symbolp ,keymap))
- (symbol-value ,keymap) ,keymap)
- global-map))
- (,kdescvar (cons (if (stringp ,namevar) ,namevar
- (key-description ,namevar))
- (if (symbolp ,keymap) ,keymap (quote ,keymap))))
- (,bindingvar (lookup-key ,kmapvar ,keyvar)))
- (let ((entry (assoc ,kdescvar personal-keybindings))
- (details (list ,command
- (unless (numberp ,bindingvar)
- ,bindingvar))))
- (if entry
- (setcdr entry details)
- (add-to-list 'personal-keybindings (cons ,kdescvar details))))
- ,(if predicate
- `(define-key ,kmapvar ,keyvar
- '(menu-item "" nil :filter (lambda (&optional _)
- (when ,predicate
- ,command))))
- `(define-key ,kmapvar ,keyvar ,command)))))
-
-;;;###autoload
-(defmacro unbind-key (key-name &optional keymap)
- "Unbind the given KEY-NAME, within the KEYMAP (if specified).
-See `bind-key' for more details."
- (let ((namevar (make-symbol "name"))
- (kdescvar (make-symbol "kdesc")))
- `(let* ((,namevar ,key-name)
- (,kdescvar (cons (if (stringp ,namevar) ,namevar
- (key-description ,namevar))
- (if (symbolp ,keymap) ,keymap (quote ,keymap)))))
- (bind-key--remove (if (vectorp ,namevar) ,namevar
- (read-kbd-macro ,namevar))
- (or (if (and ,keymap (symbolp ,keymap))
- (symbol-value ,keymap) ,keymap)
- global-map))
- (setq personal-keybindings
- (cl-delete-if (lambda (k) (equal (car k) ,kdescvar))
- personal-keybindings))
- nil)))
-
-(defun bind-key--remove (key keymap)
- "Remove KEY from KEYMAP.
-
-In contrast to `define-key', this function removes the binding from the keymap."
- (define-key keymap key nil)
- ;; Split M-key in ESC key
- (setq key (cl-mapcan (lambda (k)
- (if (and (integerp k) (/= (logand k ?\M-\0) 0))
- (list ?\e (logxor k ?\M-\0))
- (list k)))
- key))
- ;; Delete single keys directly
- (if (= (length key) 1)
- (delete key keymap)
- ;; Lookup submap and delete key from there
- (let* ((prefix (vconcat (butlast key)))
- (submap (lookup-key keymap prefix)))
- (unless (keymapp submap)
- (error "Not a keymap for %s" key))
- (when (symbolp submap)
- (setq submap (symbol-function submap)))
- (delete (last key) submap)
- ;; Delete submap if it is empty
- (when (= 1 (length submap))
- (bind-key--remove prefix keymap)))))
-
-;;;###autoload
-(defmacro bind-key* (key-name command &optional predicate)
- "Similar to `bind-key', but overrides any mode-specific bindings."
- `(bind-key ,key-name ,command override-global-map ,predicate))
-
-(defun bind-keys-form (args keymap)
- "Bind multiple keys at once.
-
-Accepts keyword arguments:
-:map MAP - a keymap into which the keybindings should be
- added
-:prefix KEY - prefix key for these bindings
-:prefix-map MAP - name of the prefix map that should be created
- for these bindings
-:prefix-docstring STR - docstring for the prefix-map variable
-:menu-name NAME - optional menu string for prefix map
-:repeat-docstring STR - docstring for the repeat-map variable
-:repeat-map MAP - name of the repeat map that should be created
- for these bindings. If specified, the
- `repeat-map' property of each command bound
- (within the scope of the `:repeat-map' keyword)
- is set to this map.
-:exit BINDINGS - Within the scope of `:repeat-map' will bind the
- key in the repeat map, but will not set the
- `repeat-map' property of the bound command.
-:continue BINDINGS - Within the scope of `:repeat-map' forces the
- same behaviour as if no special keyword had
- been used (that is, the command is bound, and
- it's `repeat-map' property set)
-:filter FORM - optional form to determine when bindings apply
-
-The rest of the arguments are conses of keybinding string and a
-function symbol (unquoted)."
- (let (map
- prefix-doc
- prefix-map
- prefix
- repeat-map
- repeat-doc
- repeat-type ;; Only used internally
- filter
- menu-name
- pkg)
-
- ;; Process any initial keyword arguments
- (let ((cont t)
- (arg-change-func 'cddr))
- (while (and cont args)
- (if (cond ((and (eq :map (car args))
- (not prefix-map))
- (setq map (cadr args)))
- ((eq :prefix-docstring (car args))
- (setq prefix-doc (cadr args)))
- ((and (eq :prefix-map (car args))
- (not (memq map '(global-map
- override-global-map))))
- (setq prefix-map (cadr args)))
- ((eq :repeat-docstring (car args))
- (setq repeat-doc (cadr args)))
- ((and (eq :repeat-map (car args))
- (not (memq map '(global-map
- override-global-map))))
- (setq repeat-map (cadr args))
- (setq map repeat-map))
- ((eq :continue (car args))
- (setq repeat-type :continue
- arg-change-func 'cdr))
- ((eq :exit (car args))
- (setq repeat-type :exit
- arg-change-func 'cdr))
- ((eq :prefix (car args))
- (setq prefix (cadr args)))
- ((eq :filter (car args))
- (setq filter (cadr args)) t)
- ((eq :menu-name (car args))
- (setq menu-name (cadr args)))
- ((eq :package (car args))
- (setq pkg (cadr args))))
- (setq args (funcall arg-change-func args))
- (setq cont nil))))
-
- (when (or (and prefix-map (not prefix))
- (and prefix (not prefix-map)))
- (error "Both :prefix-map and :prefix must be supplied"))
-
- (when repeat-type
- (unless repeat-map
- (error ":continue and :exit require specifying :repeat-map")))
-
- (when (and menu-name (not prefix))
- (error "If :menu-name is supplied, :prefix must be too"))
-
- (unless map (setq map keymap))
-
- ;; Process key binding arguments
- (let (first next)
- (while args
- (if (keywordp (car args))
- (progn
- (setq next args)
- (setq args nil))
- (if first
- (nconc first (list (car args)))
- (setq first (list (car args))))
- (setq args (cdr args))))
-
- (cl-flet
- ((wrap (map bindings)
- (if (and map pkg (not (memq map '(global-map
- override-global-map))))
- `((if (boundp ',map)
- ,(macroexp-progn bindings)
- (eval-after-load
- ,(if (symbolp pkg) `',pkg pkg)
- ',(macroexp-progn bindings))))
- bindings)))
-
- (append
- (when prefix-map
- `((defvar ,prefix-map)
- ,@(when prefix-doc `((put ',prefix-map 'variable-documentation ,prefix-doc)))
- ,@(if menu-name
- `((define-prefix-command ',prefix-map nil ,menu-name))
- `((define-prefix-command ',prefix-map)))
- ,@(if (and map (not (eq map 'global-map)))
- (wrap map `((bind-key ,prefix ',prefix-map ,map ,filter)))
- `((bind-key ,prefix ',prefix-map nil ,filter)))))
- (when repeat-map
- `((defvar ,repeat-map (make-sparse-keymap)
- ,@(when repeat-doc `(,repeat-doc)))))
- (wrap map
- (cl-mapcan
- (lambda (form)
- (let ((fun (and (cdr form) (list 'function (cdr form)))))
- (if prefix-map
- `((bind-key ,(car form) ,fun ,prefix-map ,filter))
- (if (and map (not (eq map 'global-map)))
- ;; Only needed in this branch, since when
- ;; repeat-map is non-nil, map is always
- ;; non-nil
- `(,@(when (and repeat-map (not (eq repeat-type :exit)))
- `((put ,fun 'repeat-map ',repeat-map)))
- (bind-key ,(car form) ,fun ,map ,filter))
- `((bind-key ,(car form) ,fun nil ,filter))))))
- first))
- (when next
- (bind-keys-form `(,@(when repeat-map `(:repeat-map ,repeat-map))
- ,@(if pkg
- (cons :package (cons pkg next))
- next)) map)))))))
-
-;;;###autoload
-(defmacro bind-keys (&rest args)
- "Bind multiple keys at once.
-
-Accepts keyword arguments:
-:map MAP - a keymap into which the keybindings should be
- added
-:prefix KEY - prefix key for these bindings
-:prefix-map MAP - name of the prefix map that should be created
- for these bindings
-:prefix-docstring STR - docstring for the prefix-map variable
-:menu-name NAME - optional menu string for prefix map
-:repeat-docstring STR - docstring for the repeat-map variable
-:repeat-map MAP - name of the repeat map that should be created
- for these bindings. If specified, the
- `repeat-map' property of each command bound
- (within the scope of the `:repeat-map' keyword)
- is set to this map.
-:exit BINDINGS - Within the scope of `:repeat-map' will bind the
- key in the repeat map, but will not set the
- `repeat-map' property of the bound command.
-:continue BINDINGS - Within the scope of `:repeat-map' forces the
- same behaviour as if no special keyword had
- been used (that is, the command is bound, and
- it's `repeat-map' property set)
-:filter FORM - optional form to determine when bindings apply
-
-The rest of the arguments are conses of keybinding string and a
-function symbol (unquoted)."
- (macroexp-progn (bind-keys-form args nil)))
-
-;;;###autoload
-(defmacro bind-keys* (&rest args)
- (macroexp-progn (bind-keys-form args 'override-global-map)))
-
-(defun get-binding-description (elem)
- (cond
- ((listp elem)
- (cond
- ((memq (car elem) '(lambda function))
- (if (and bind-key-describe-special-forms
- (stringp (nth 2 elem)))
- (nth 2 elem)
- "#"))
- ((eq 'closure (car elem))
- (if (and bind-key-describe-special-forms
- (stringp (nth 3 elem)))
- (nth 3 elem)
- "#"))
- ((eq 'keymap (car elem))
- "#")
- (t
- elem)))
- ;; must be a symbol, non-symbol keymap case covered above
- ((and bind-key-describe-special-forms (keymapp elem))
- (let ((doc (get elem 'variable-documentation)))
- (if (stringp doc) doc elem)))
- ((symbolp elem)
- elem)
- (t
- "#")))
-
-(defun compare-keybindings (l r)
- (let* ((regex bind-key-segregation-regexp)
- (lgroup (and (string-match regex (caar l))
- (match-string 0 (caar l))))
- (rgroup (and (string-match regex (caar r))
- (match-string 0 (caar r))))
- (lkeymap (cdar l))
- (rkeymap (cdar r)))
- (cond
- ((and (null lkeymap) rkeymap)
- (cons t t))
- ((and lkeymap (null rkeymap))
- (cons nil t))
- ((and lkeymap rkeymap
- (not (string= (symbol-name lkeymap) (symbol-name rkeymap))))
- (cons (string< (symbol-name lkeymap) (symbol-name rkeymap)) t))
- ((and (null lgroup) rgroup)
- (cons t t))
- ((and lgroup (null rgroup))
- (cons nil t))
- ((and lgroup rgroup)
- (if (string= lgroup rgroup)
- (cons (string< (caar l) (caar r)) nil)
- (cons (string< lgroup rgroup) t)))
- (t
- (cons (string< (caar l) (caar r)) nil)))))
-
-;;;###autoload
-(defun describe-personal-keybindings ()
- "Display all the personal keybindings defined by `bind-key'."
- (interactive)
- (with-output-to-temp-buffer "*Personal Keybindings*"
- (princ (format (concat "Key name%s Command%s Comments\n%s %s "
- "---------------------\n")
- (make-string (- (car bind-key-column-widths) 9) ? )
- (make-string (- (cdr bind-key-column-widths) 8) ? )
- (make-string (1- (car bind-key-column-widths)) ?-)
- (make-string (1- (cdr bind-key-column-widths)) ?-)))
- (let (last-binding)
- (dolist (binding
- (setq personal-keybindings
- (sort personal-keybindings
- (lambda (l r)
- (car (compare-keybindings l r))))))
-
- (if (not (eq (cdar last-binding) (cdar binding)))
- (princ (format "\n\n%s: %s\n%s\n\n"
- (cdar binding) (caar binding)
- (make-string (+ 21 (car bind-key-column-widths)
- (cdr bind-key-column-widths)) ?-)))
- (if (and last-binding
- (cdr (compare-keybindings last-binding binding)))
- (princ "\n")))
-
- (let* ((key-name (caar binding))
- (at-present (lookup-key (or (symbol-value (cdar binding))
- (current-global-map))
- (read-kbd-macro key-name)))
- (command (nth 1 binding))
- (was-command (nth 2 binding))
- (command-desc (get-binding-description command))
- (was-command-desc (and was-command
- (get-binding-description was-command)))
- (at-present-desc (get-binding-description at-present)))
- (let ((line
- (format
- (format "%%-%ds%%-%ds%%s\n" (car bind-key-column-widths)
- (cdr bind-key-column-widths))
- key-name (format "`%s\'" command-desc)
- (if (string= command-desc at-present-desc)
- (if (or (null was-command)
- (string= command-desc was-command-desc))
- ""
- (format "was `%s\'" was-command-desc))
- (format "[now: `%s\']" at-present)))))
- (princ (if (string-match "[ \t]+\n" line)
- (replace-match "\n" t t line)
- line))))
-
- (setq last-binding binding)))))
-
-(provide 'bind-key)
-
-;; Local Variables:
-;; outline-regexp: ";;;\\(;* [^\s\t\n]\\|###autoload\\)\\|("
-;; End:
-
-;;; bind-key.el ends here
diff --git a/emacs.d/use-package/default.mk b/emacs.d/use-package/default.mk
deleted file mode 100644
index e9c5f21..0000000
--- a/emacs.d/use-package/default.mk
+++ /dev/null
@@ -1,92 +0,0 @@
-TOP := $(dir $(lastword $(MAKEFILE_LIST)))
-
-## User options ######################################################
-#
-# You can override these settings in "config.mk" or on the command
-# line.
-#
-# You might also want to set LOAD_PATH. If you do, then it must
-# contain "-L .".
-#
-# If you don't do so, then the default is set in the "Load-Path"
-# section below. The default assumes that all dependencies are
-# installed either at "../", or when using package.el
-# at "ELPA_DIR/-".
-
-PREFIX ?= /usr/local
-sharedir ?= $(PREFIX)/share
-lispdir ?= $(sharedir)/emacs/site-lisp/use-package
-infodir ?= $(sharedir)/info
-docdir ?= $(sharedir)/doc/use-package
-statsdir ?= $(TOP)/stats
-
-CP ?= install -p -m 644
-MKDIR ?= install -p -m 755 -d
-RMDIR ?= rm -rf
-TAR ?= tar
-SED ?= sed
-
-EMACS ?= emacs
-BATCH = $(EMACS) -Q --batch $(LOAD_PATH)
-
-INSTALL_INFO ?= $(shell command -v ginstall-info || printf install-info)
-MAKEINFO ?= makeinfo
-MANUAL_HTML_ARGS ?= --css-ref /assets/page.css
-
-## Files #############################################################
-
-PKG = use-package
-PACKAGES = use-package
-
-TEXIPAGES = $(addsuffix .texi,$(filter-out git-commit,$(PACKAGES)))
-INFOPAGES = $(addsuffix .info,$(filter-out git-commit,$(PACKAGES)))
-HTMLFILES = $(addsuffix .html,$(filter-out git-commit,$(PACKAGES)))
-HTMLDIRS = $(filter-out git-commit,$(PACKAGES))
-PDFFILES = $(addsuffix .pdf,$(filter-out git-commit,$(PACKAGES)))
-
-ELS = use-package.el
-ELS += bind-key.el
-ELS += bind-chord.el
-ELS += use-package-bind-key.el
-ELS += use-package-core.el
-ELS += use-package-delight.el
-ELS += use-package-diminish.el
-ELS += use-package-ensure.el
-ELS += use-package-jump.el
-ELS += use-package-tests.el
-ELS += use-package-chords.el
-ELS += use-package-ensure-system-package.el
-ELCS = $(ELS:.el=.elc)
-ELMS = use-package.el $(filter-out $(addsuffix .el,$(PACKAGES)),$(ELS))
-ELGS =
-
-## Versions ##########################################################
-
-VERSION = 2.4.4
-
-USE_PACKAGE_VERSION = 2.4.4
-
-EMACS_VERSION = 24.3
-
-EMACSOLD := $(shell $(BATCH) --eval \
- "(and (version< emacs-version \"$(EMACS_VERSION)\") (princ \"true\"))")
-ifeq "$(EMACSOLD)" "true"
- $(error At least version $(EMACS_VERSION) of Emacs is required)
-endif
-
-## Load-Path #########################################################
-
-ifndef LOAD_PATH
-
-ELPA_DIR ?= $(HOME)/.emacs.d/elpa
-
-SYSTYPE := $(shell $(EMACS) -Q --batch --eval "(princ system-type)")
-ifeq ($(SYSTYPE), windows-nt)
- CYGPATH := $(shell cygpath --version 2>/dev/null)
-endif
-
-LOAD_PATH = -L $(TOP)
-
-endif # ifndef LOAD_PATH
-
-DOC_LOAD_PATH ?= $(LOAD_PATH) -L $(HOME)/emacs/site-lisp
diff --git a/emacs.d/use-package/use-package-bind-key.el b/emacs.d/use-package/use-package-bind-key.el
deleted file mode 100644
index 75def7f..0000000
--- a/emacs.d/use-package/use-package-bind-key.el
+++ /dev/null
@@ -1,171 +0,0 @@
-;;; use-package-bind-key.el --- Support for the :bind/:bind-keymap keywords -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
-
-;; Author: John Wiegley
-;; Maintainer: John Wiegley
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;; Provides support for the :bind, :bind*, :bind-keymap and :bind-keymap*
-;; keywords. Note that these are currently still baked into
-;; `use-package-keywords' and `use-package-deferring-keywords', although this
-;; is harmless if they are never used.
-
-;;; Code:
-
-(require 'use-package-core)
-(require 'bind-key)
-
-;;;###autoload
-(defun use-package-autoload-keymap (keymap-symbol package override)
- "Loads PACKAGE and then binds the key sequence used to invoke
-this function to KEYMAP-SYMBOL. It then simulates pressing the
-same key sequence a again, so that the next key pressed is routed
-to the newly loaded keymap.
-
-This function supports use-package's :bind-keymap keyword. It
-works by binding the given key sequence to an invocation of this
-function for a particular keymap. The keymap is expected to be
-defined by the package. In this way, loading the package is
-deferred until the prefix key sequence is pressed."
- (if (not (require package nil t))
- (use-package-error (format "Cannot load package.el: %s" package))
- (if (and (boundp keymap-symbol)
- (keymapp (symbol-value keymap-symbol)))
- (let* ((kv (this-command-keys-vector))
- (key (key-description kv))
- (keymap (symbol-value keymap-symbol)))
- (if override
- (bind-key* key keymap)
- (bind-key key keymap))
- (setq unread-command-events
- (mapcar (lambda (ev) (cons t ev))
- (listify-key-sequence kv))))
- (use-package-error
- (format "package.el %s failed to define keymap %s"
- package keymap-symbol)))))
-
-;;;###autoload
-(defun use-package-normalize-binder (name keyword args)
- (let ((arg args)
- args*)
- (while arg
- (let ((x (car arg)))
- (cond
- ;; (KEY . COMMAND)
- ((and (consp x)
- (or (stringp (car x))
- (vectorp (car x)))
- (or (use-package-recognize-function (cdr x) t #'stringp)))
- (setq args* (nconc args* (list x)))
- (setq arg (cdr arg)))
- ;; KEYWORD
- ;; :map KEYMAP
- ;; :prefix-docstring STRING
- ;; :prefix-map SYMBOL
- ;; :prefix STRING
- ;; :repeat-docstring STRING
- ;; :repeat-map SYMBOL
- ;; :filter SEXP
- ;; :menu-name STRING
- ;; :package SYMBOL
- ;; :continue and :exit are used within :repeat-map
- ((or (and (eq x :map) (symbolp (cadr arg)))
- (and (eq x :prefix) (stringp (cadr arg)))
- (and (eq x :prefix-map) (symbolp (cadr arg)))
- (and (eq x :prefix-docstring) (stringp (cadr arg)))
- (and (eq x :repeat-map) (symbolp (cadr arg)))
- (eq x :continue)
- (eq x :exit)
- (and (eq x :repeat-docstring) (stringp (cadr arg)))
- (eq x :filter)
- (and (eq x :menu-name) (stringp (cadr arg)))
- (and (eq x :package) (symbolp (cadr arg))))
- (setq args* (nconc args* (list x (cadr arg))))
- (setq arg (cddr arg)))
- ((listp x)
- (setq args*
- (nconc args* (use-package-normalize-binder name keyword x)))
- (setq arg (cdr arg)))
- (t
- ;; Error!
- (use-package-error
- (concat (symbol-name name)
- " wants arguments acceptable to the `bind-keys' macro,"
- " or a list of such values"))))))
- args*))
-
-;;;; :bind, :bind*
-
-;;;###autoload
-(defalias 'use-package-normalize/:bind 'use-package-normalize-binder)
-;;;###autoload
-(defalias 'use-package-normalize/:bind* 'use-package-normalize-binder)
-
-;; jww (2017-12-07): This is too simplistic. It will fail to determine
-;; autoloads in this situation:
-;; (use-package foo
-;; :bind (:map foo-map (("C-a" . func))))
-;;;###autoload
-(defalias 'use-package-autoloads/:bind 'use-package-autoloads-mode)
-;;;###autoload
-(defalias 'use-package-autoloads/:bind* 'use-package-autoloads-mode)
-
-;;;###autoload
-(defun use-package-handler/:bind
- (name _keyword args rest state &optional bind-macro)
- (use-package-concat
- (use-package-process-keywords name rest state)
- `(,@(mapcar
- #'(lambda (xs)
- `(,(if bind-macro bind-macro 'bind-keys)
- :package ,name ,@(use-package-normalize-commands xs)))
- (use-package-split-list-at-keys :break args)))))
-
-(defun use-package-handler/:bind* (name keyword arg rest state)
- (use-package-handler/:bind name keyword arg rest state 'bind-keys*))
-
-;;;; :bind-keymap, :bind-keymap*
-
-;;;###autoload
-(defalias 'use-package-normalize/:bind-keymap 'use-package-normalize-binder)
-;;;###autoload
-(defalias 'use-package-normalize/:bind-keymap* 'use-package-normalize-binder)
-
-;;;###autoload
-(defun use-package-handler/:bind-keymap
- (name _keyword args rest state &optional override)
- (use-package-concat
- (use-package-process-keywords name rest state)
- (mapcar
- #'(lambda (binding)
- `(,(if override 'bind-key* 'bind-key)
- ,(car binding)
- #'(lambda ()
- (interactive)
- (use-package-autoload-keymap
- ',(cdr binding) ',(use-package-as-symbol name)
- ,override))))
- args)))
-
-;;;###autoload
-(defun use-package-handler/:bind-keymap* (name keyword arg rest state)
- (use-package-handler/:bind-keymap name keyword arg rest state t))
-
-(provide 'use-package-bind-key)
-
-;;; use-package-bind-key.el ends here
diff --git a/emacs.d/use-package/use-package-chords-tests.el b/emacs.d/use-package/use-package-chords-tests.el
deleted file mode 100644
index d78f688..0000000
--- a/emacs.d/use-package/use-package-chords-tests.el
+++ /dev/null
@@ -1,153 +0,0 @@
-;;; use-package-chords-tests.el --- Tests for use-package-chords.el -*- lexical-binding: t; -*-
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Code:
-
-(require 'use-package)
-(require 'use-package-tests)
-(require 'use-package-chords)
-
-(defmacro match-expansion (form &rest value)
- `(should (pcase (expand-minimally ,form)
- ,@(mapcar #'(lambda (x) (list x t)) value))))
-
-(defun use-package-test-normalize-chord (&rest args)
- (apply #'use-package-normalize-binder 'foo :chords args))
-
-(ert-deftest use-package-test-normalize/:chords-1 ()
- (should (equal (use-package-test-normalize-chord
- '(("C-a" . alpha)))
- '(("C-a" . alpha)))))
-
-(ert-deftest use-package-test-normalize/:chords-2 ()
- (should (equal (use-package-test-normalize-chord
- '(("C-a" . alpha)
- :map foo-map
- ("C-b" . beta)))
- '(("C-a" . alpha)
- :map foo-map
- ("C-b" . beta)))))
-
-(ert-deftest use-package-test-normalize/:chords-3 ()
- (should (equal (use-package-test-normalize-chord
- '(:map foo-map
- ("C-a" . alpha)
- ("C-b" . beta)))
- '(:map foo-map
- ("C-a" . alpha)
- ("C-b" . beta)))))
-
-(ert-deftest use-package-test/:chords-1 ()
- (match-expansion
- (use-package foo :chords ("C-k" . key1) ("C-u" . key2))
- `(progn
- (unless
- (fboundp 'key1)
- (autoload #'key1 "foo" nil t))
- (unless
- (fboundp 'key2)
- (autoload #'key2 "foo" nil t))
- (bind-chord "C-k" #'key1 nil)
- (bind-chord "C-u" #'key2 nil))))
-
-(ert-deftest use-package-test/:chords-2 ()
- (match-expansion
- (use-package foo :chords (("C-k" . key1) ("C-u" . key2)))
- `(progn
- (unless (fboundp 'key1)
- (autoload #'key1 "foo" nil t))
- (unless (fboundp 'key2)
- (autoload #'key2 "foo" nil t))
- (bind-chord "C-k" #'key1 nil)
- (bind-chord "C-u" #'key2 nil))))
-
-(ert-deftest use-package-test/:chords-3 ()
- (match-expansion
- (use-package foo :chords (:map my-map ("C-k" . key1) ("C-u" . key2)))
- `(progn
- (unless
- (fboundp 'key1)
- (autoload #'key1 "foo" nil t))
- (unless
- (fboundp 'key2)
- (autoload #'key2 "foo" nil t))
- (if
- (boundp 'my-map)
- (progn
- (bind-chord "C-k" #'key1 my-map)
- (bind-chord "C-u" #'key2 my-map))
- (eval-after-load 'foo
- '(progn
- (bind-chord "C-k" #'key1 my-map)
- (bind-chord "C-u" #'key2 my-map)))))))
-
-(ert-deftest use-package-test/:chords-4 ()
- (should-error
- (match-expansion
- (use-package foo :chords :map my-map ("C-k" . key1) ("C-u" . key2))
- `(bind-chords :package foo))))
-
-(ert-deftest use-package-test/:chords-5 ()
- (match-expansion
- (use-package foo :chords ("C-k" . key1) (:map my-map ("C-u" . key2)))
- `(progn
- (unless (fboundp 'key1)
- (autoload #'key1 "foo" nil t))
- (unless (fboundp 'key2)
- (autoload #'key2 "foo" nil t))
- (progn
- (bind-chord "C-k" #'key1 nil)
- (if
- (boundp 'my-map)
- (bind-chord "C-u" #'key2 my-map)
- (eval-after-load 'foo
- '(bind-chord "C-u" #'key2 my-map)))))))
-
-(ert-deftest use-package-test/:chords-6 ()
- (match-expansion
- (use-package foo
- :chords
- ("C-k" . key1)
- (:map my-map ("C-u" . key2))
- (:map my-map2 ("C-u" . key3)))
- `(progn
- (unless
- (fboundp 'key1)
- (autoload #'key1 "foo" nil t))
- (unless
- (fboundp 'key2)
- (autoload #'key2 "foo" nil t))
- (unless
- (fboundp 'key3)
- (autoload #'key3 "foo" nil t))
- (progn
- (bind-chord "C-k" #'key1 nil)
- (if
- (boundp 'my-map)
- (bind-chord "C-u" #'key2 my-map)
- (eval-after-load 'foo
- '(bind-chord "C-u" #'key2 my-map)))
- (if
- (boundp 'my-map2)
- (bind-chord "C-u" #'key3 my-map2)
- (eval-after-load 'foo
- '(bind-chord "C-u" #'key3 my-map2)))))))
-
-;; Local Variables:
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; End:
-
-;;; use-package-chords-tests.el ends here
diff --git a/emacs.d/use-package/use-package-chords.el b/emacs.d/use-package/use-package-chords.el
deleted file mode 100644
index 479083b..0000000
--- a/emacs.d/use-package/use-package-chords.el
+++ /dev/null
@@ -1,54 +0,0 @@
-;;; use-package-chords.el --- key-chord keyword for use-package -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2015-2022 Free Software Foundation, Inc.
-
-;; Author: Justin Talbott
-;; Keywords: convenience, tools, extensions
-;; URL: https://github.com/jwiegley/use-package
-;; Version: 0.2.1
-;; Package-Requires: ((use-package "2.1") (bind-key "1.0") (bind-chord "0.2") (key-chord "0.6"))
-;; Filename: use-package-chords.el
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;; The `:chords' keyword allows you to define `key-chord' bindings for
-;; `use-package' declarations in the same manner as the `:bind'
-;; keyword.
-
-;;; Code:
-
-(require 'use-package)
-(require 'bind-chord)
-
-;;;###autoload
-(defalias 'use-package-autoloads/:chords 'use-package-autoloads-mode)
-
-;;;###autoload
-(defalias 'use-package-normalize/:chords 'use-package-normalize-binder)
-
-;;;###autoload
-(defun use-package-handler/:chords (name _keyword arg rest state)
- "Handler for `:chords' keyword in `use-package'."
- (use-package-concat
- (use-package-process-keywords name rest state)
- `(,(macroexpand
- `(bind-chords :package ,name ,@arg)))))
-
-(add-to-list 'use-package-keywords :chords)
-
-(provide 'use-package-chords)
-
-;;; use-package-chords.el ends here
diff --git a/emacs.d/use-package/use-package-core.el b/emacs.d/use-package/use-package-core.el
deleted file mode 100644
index 1190f14..0000000
--- a/emacs.d/use-package/use-package-core.el
+++ /dev/null
@@ -1,1716 +0,0 @@
-;;; use-package-core.el --- A configuration macro for simplifying your .emacs -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
-
-;; Author: John Wiegley
-;; Maintainer: John Wiegley
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;; The `use-package' declaration macro allows you to isolate package
-;; configuration in your ".emacs" in a way that is performance-oriented and,
-;; well, just tidy. I created it because I have over 80 packages that I use
-;; in Emacs, and things were getting difficult to manage. Yet with this
-;; utility my total load time is just under 1 second, with no loss of
-;; functionality!
-;;
-;; Please see README.md from the same repository for documentation.
-
-;;; Code:
-
-(require 'bytecomp)
-(require 'cl-lib)
-(require 'tabulated-list)
-
-(eval-and-compile
- ;; Declare a synthetic theme for :custom variables.
- ;; Necessary in order to avoid having those variables saved by custom.el.
- (deftheme use-package))
-
-(enable-theme 'use-package)
-;; Remove the synthetic use-package theme from the enabled themes, so
-;; iterating over them to "disable all themes" won't disable it.
-(setq custom-enabled-themes (remq 'use-package custom-enabled-themes))
-
-(eval-when-compile
- (if (and (eq emacs-major-version 24) (eq emacs-minor-version 3))
- (progn
- (defsubst hash-table-keys (hash-table)
- "Return a list of keys in HASH-TABLE."
- (cl-loop for k being the hash-keys of hash-table collect k))
- (defsubst string-suffix-p (suffix string &optional ignore-case)
- (let ((start-pos (- (length string) (length suffix))))
- (and (>= start-pos 0)
- (eq t (compare-strings suffix nil nil
- string start-pos nil ignore-case))))))
- (require 'subr-x)))
-
-(eval-when-compile
- (require 'regexp-opt))
-
-(defgroup use-package nil
- "A `use-package' declaration for simplifying your `.emacs'."
- :group 'startup)
-
-(defconst use-package-version "2.4.4"
- "This version of `use-package'.")
-
-(defcustom use-package-keywords
- '(:disabled
- :load-path
- :requires
- :defines
- :functions
- :preface
- :if :when :unless
- :no-require
- :catch
- :after
- :custom
- :custom-face
- :bind
- :bind*
- :bind-keymap
- :bind-keymap*
- :interpreter
- :mode
- :magic
- :magic-fallback
- :hook
- ;; Any other keyword that also declares commands to be autoloaded (such as
- ;; :bind) must appear before this keyword.
- :commands
- :autoload
- :init
- :defer
- :demand
- :load
- ;; This must occur almost last; the only forms which should appear after
- ;; are those that must happen directly after the config forms.
- :config
- :local)
- "The set of valid keywords, in the order they are processed in.
-The order of this list is *very important*, so it is only
-advisable to insert new keywords, never to delete or reorder
-them. Further, attention should be paid to the NEWS.md if the
-default order ever changes, as they may have subtle effects on
-the semantics of `use-package' declarations and may necessitate
-changing where you had inserted a new keyword earlier.
-
-Note that `:disabled' is special in this list, as it causes
-nothing at all to happen, even if the rest of the `use-package'
-declaration is incorrect."
- :type '(repeat symbol)
- :group 'use-package)
-
-(defcustom use-package-deferring-keywords
- '(:bind-keymap
- :bind-keymap*
- :commands
- :autoload)
- "Unless `:demand' is used, keywords in this list imply deferred loading.
-The reason keywords like `:hook' are not in this list is that
-they only imply deferred loading if they reference actual
-function symbols that can be autoloaded from the module; whereas
-the default keywords provided here always defer loading unless
-otherwise requested."
- :type '(repeat symbol)
- :group 'use-package)
-
-(defcustom use-package-ignore-unknown-keywords nil
- "If non-nil, warn instead of signaling error for unknown keywords.
-The unknown keyword and its associated arguments will be ignored
-in the `use-package' expansion."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-use-theme t
- "If non-nil, use a custom theme to avoid saving :custom
-variables twice (once in the Custom file, once in the use-package
-call)."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-verbose nil
- "Whether to report about loading and configuration details.
-If you customize this, then you should require the `use-package'
-feature in files that use `use-package', even if these files only
-contain compiled expansions of the macros. If you don't do so,
-then the expanded macros do their job silently."
- :type '(choice (const :tag "Quiet, without catching errors" errors)
- (const :tag "Quiet" nil)
- (const :tag "Verbose" t)
- (const :tag "Debug" debug))
- :group 'use-package)
-
-(defcustom use-package-check-before-init nil
- "If non-nil, check that package exists before executing its `:init' block.
-This check is performed by calling `locate-library'."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-always-defer nil
- "If non-nil, assume `:defer t' unless `:demand' is used.
-See also `use-package-defaults', which uses this value."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-always-demand nil
- "If non-nil, assume `:demand t' unless `:defer' is used.
-See also `use-package-defaults', which uses this value."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-defaults
- '(;; this '(t) has special meaning; see `use-package-handler/:config'
- (:config '(t) t)
- (:init nil t)
- (:catch t (lambda (name args)
- (not use-package-expand-minimally)))
- (:defer use-package-always-defer
- (lambda (name args)
- (and use-package-always-defer
- (not (plist-member args :defer))
- (not (plist-member args :demand)))))
- (:demand use-package-always-demand
- (lambda (name args)
- (and use-package-always-demand
- (not (plist-member args :defer))
- (not (plist-member args :demand))))))
- "Default values for specified `use-package' keywords.
-Each entry in the alist is a list of three elements:
-The first element is the `use-package' keyword.
-
-The second is a form that can be evaluated to get the default
-value. It can also be a function that will receive the name of
-the `use-package' declaration and the keyword plist given to
-`use-package', in normalized form. The value it returns should
-also be in normalized form (which is sometimes *not* what one
-would normally write in a `use-package' declaration, so use
-caution).
-
-The third element is a form that can be evaluated to determine
-whether or not to assign a default value; if it evaluates to nil,
-then the default value is not assigned even if the keyword is not
-present in the `use-package' form. This third element may also be
-a function, in which case it receives the name of the package (as
-a symbol) and a list of keywords (in normalized form). It should
-return nil or non-nil depending on whether defaulting should be
-attempted."
- :type `(repeat
- (list (choice :tag "Keyword"
- ,@(mapcar #'(lambda (k) (list 'const k))
- use-package-keywords))
- (choice :tag "Default value" sexp function)
- (choice :tag "Enable if non-nil" sexp function)))
- :group 'use-package)
-
-(defcustom use-package-merge-key-alist
- '((:if . (lambda (new old) `(and ,new ,old)))
- (:after . (lambda (new old) `(:all ,new ,old)))
- (:defer . (lambda (new old) old))
- (:bind . (lambda (new old) (append new (list :break) old))))
- "Alist of keys and the functions used to merge multiple values.
-For example, if the following form is provided:
-
- (use-package foo :if pred1 :if pred2)
-
-Then based on the above defaults, the merged result will be:
-
- (use-package foo :if (and pred1 pred2))
-
-This is done so that, at the stage of invoking handlers, each
-handler is called only once."
- :type `(repeat
- (cons (choice :tag "Keyword"
- ,@(mapcar #'(lambda (k) (list 'const k))
- use-package-keywords)
- (const :tag "Any" t))
- function))
- :group 'use-package)
-
-(defcustom use-package-hook-name-suffix "-hook"
- "Text append to the name of hooks mentioned by :hook.
-Set to nil if you don't want this to happen; it's only a
-convenience."
- :type '(choice string (const :tag "No suffix" nil))
- :group 'use-package)
-
-(defcustom use-package-minimum-reported-time 0.1
- "Minimal load time that will be reported.
-Note that `use-package-verbose' has to be set to a non-nil value
-for anything to be reported at all."
- :type 'number
- :group 'use-package)
-
-(defcustom use-package-inject-hooks nil
- "If non-nil, add hooks to the `:init' and `:config' sections.
-In particular, for a given package `foo', the following hooks
-become available:
-
- `use-package--foo--pre-init-hook'
- `use-package--foo--post-init-hook'
- `use-package--foo--pre-config-hook'
- `use-package--foo--post-config-hook'
-
-This way, you can add to these hooks before evaluation of a
-`use-package` declaration, and exercise some control over what
-happens.
-
-NOTE: These hooks are run even if the user does not specify an
-`:init' or `:config' block, and they will happen at the regular
-time when initialization and configuration would have been
-performed.
-
-NOTE: If the `pre-init' hook return a nil value, that block's
-user-supplied configuration is not evaluated, so be certain to
-return t if you only wish to add behavior to what the user had
-specified."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-expand-minimally nil
- "If non-nil, make the expanded code as minimal as possible.
-This disables:
-
- - Printing to the *Messages* buffer of slowly-evaluating forms
- - Capturing of load errors (normally redisplayed as warnings)
- - Conditional loading of packages (load failures become errors)
-
-The main advantage to this variable is that, if you know your
-configuration works, it will make the byte-compiled file as
-minimal as possible. It can also help with reading macro-expanded
-definitions, to understand the main intent of what's happening."
- :type 'boolean
- :group 'use-package)
-
-(defcustom use-package-form-regexp-eval
- `(concat ,(eval-when-compile
- (concat "^\\s-*("
- (regexp-opt '("use-package" "require") t)
- "\\s-+\\("))
- (or (bound-and-true-p lisp-mode-symbol-regexp)
- "\\(?:\\sw\\|\\s_\\|\\\\.\\)+") "\\)")
- "Sexp providing regexp for finding `use-package' forms in user files.
-This is used by `use-package-jump-to-package-form' and
-`use-package-enable-imenu-support'."
- :type 'sexp
- :group 'use-package)
-
-(defcustom use-package-enable-imenu-support nil
- "If non-nil, cause imenu to see `use-package' declarations.
-This is done by adjusting `lisp-imenu-generic-expression' to
-include support for finding `use-package' and `require' forms.
-
-Must be set before loading `use-package'."
- :type 'boolean
- :set
- #'(lambda (sym value)
- (eval-after-load 'lisp-mode
- (if value
- `(add-to-list 'lisp-imenu-generic-expression
- (list "Packages" ,use-package-form-regexp-eval 2))
- `(setq lisp-imenu-generic-expression
- (remove (list "Packages" ,use-package-form-regexp-eval 2)
- lisp-imenu-generic-expression))))
- (set-default sym value))
- :group 'use-package)
-
-(defconst use-package-font-lock-keywords
- '(("(\\(use-package\\)\\_>[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?"
- (1 font-lock-keyword-face)
- (2 font-lock-constant-face nil t))))
-
-(font-lock-add-keywords 'emacs-lisp-mode use-package-font-lock-keywords)
-
-(defcustom use-package-compute-statistics nil
- "If non-nil, compute statistics concerned `use-package' declarations.
-View the statistical report using `use-package-report'. Note that
-if this option is enabled, you must require `use-package' in your
-user init file at loadup time, or you will see errors concerning
-undefined variables."
- :type 'boolean
- :group 'use-package)
-
-(defvar use-package-statistics (make-hash-table))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Utility functions
-;;
-
-(defsubst use-package-error (msg)
- "Report MSG as an error, so the user knows it came from this package."
- (error "use-package: %s" msg))
-
-(defsubst use-package-concat (&rest elems)
- "Delete all empty lists from ELEMS (nil or (list nil)), and append them."
- (apply #'append (delete nil (delete (list nil) elems))))
-
-(defsubst use-package-non-nil-symbolp (sym)
- (and sym (symbolp sym)))
-
-(defsubst use-package-as-symbol (string-or-symbol)
- "If STRING-OR-SYMBOL is already a symbol, return it.
-Otherwise convert it to a symbol and return that."
- (if (symbolp string-or-symbol) string-or-symbol
- (intern string-or-symbol)))
-
-(defsubst use-package-as-string (string-or-symbol)
- "If STRING-OR-SYMBOL is already a string, return it.
-Otherwise convert it to a string and return that."
- (if (stringp string-or-symbol) string-or-symbol
- (symbol-name string-or-symbol)))
-
-(defsubst use-package-regex-p (re)
- "Return t if RE is some regexp-like thing."
- (or (and (listp re) (eq (car re) 'rx))
- (stringp re)))
-
-(defun use-package-normalize-regex (re)
- "Given some regexp-like thing in RE, resolve to a regular expression."
- (cond
- ((and (listp re) (eq (car re) 'rx)) (eval re))
- ((stringp re) re)
- (t (error "Not recognized as regular expression: %s" re))))
-
-(defsubst use-package-is-pair (x car-pred cdr-pred)
- "Return non-nil if X is a cons satisfying the given predicates.
-CAR-PRED and CDR-PRED are applied to X's `car' and `cdr',
-respectively."
- (and (consp x)
- (funcall car-pred (car x))
- (funcall cdr-pred (cdr x))))
-
-(defun use-package-as-mode (string-or-symbol)
- "If STRING-OR-SYMBOL ends in `-mode' (or its name does), return
-it as a symbol. Otherwise, return it as a symbol with `-mode'
-appended."
- (let ((string (use-package-as-string string-or-symbol)))
- (intern (if (string-match "-mode\\'" string)
- string
- (concat string "-mode")))))
-
-(defsubst use-package-load-name (name &optional noerror)
- "Return a form which will load or require NAME.
-It does the right thing no matter if NAME is a string or symbol.
-Argument NOERROR means to indicate load failures as a warning."
- (if (stringp name)
- `(load ,name ,noerror)
- `(require ',name nil ,noerror)))
-
-(defun use-package-hook-injector (name-string keyword body)
- "Wrap pre/post hook injections around the given BODY for KEYWORD.
-The BODY is a list of forms, so `((foo))' if only `foo' is being called."
- (if (not use-package-inject-hooks)
- body
- (let ((keyword-name (substring (format "%s" keyword) 1)))
- `((when (run-hook-with-args-until-failure
- ',(intern (concat "use-package--" name-string
- "--pre-" keyword-name "-hook")))
- ,@body
- (run-hooks
- ',(intern (concat "use-package--" name-string
- "--post-" keyword-name "-hook"))))))))
-
-(defun use-package-with-elapsed-timer (text body)
- "BODY is a list of forms, so `((foo))' if only `foo' is being called."
- (declare (indent 1))
- (if use-package-expand-minimally
- body
- (let ((nowvar (make-symbol "now")))
- (if (bound-and-true-p use-package-verbose)
- `((let ((,nowvar (current-time)))
- (message "%s..." ,text)
- (prog1
- ,(macroexp-progn body)
- (let ((elapsed
- (float-time (time-subtract (current-time) ,nowvar))))
- (if (> elapsed ,use-package-minimum-reported-time)
- (message "%s...done (%.3fs)" ,text elapsed)
- (message "%s...done" ,text))))))
- body))))
-
-(put 'use-package-with-elapsed-timer 'lisp-indent-function 1)
-
-(defun use-package-require (name &optional no-require body)
- (if use-package-expand-minimally
- (use-package-concat
- (unless no-require
- (list (use-package-load-name name)))
- body)
- (if no-require
- body
- (use-package-with-elapsed-timer
- (format "Loading package %s" name)
- `((if (not ,(use-package-load-name name t))
- (display-warning 'use-package
- (format "Cannot load %s" ',name)
- :error)
- ,@body))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Property lists
-;;
-
-(defun use-package-plist-delete (plist property)
- "Delete PROPERTY from PLIST.
-This is in contrast to merely setting it to 0."
- (let (p)
- (while plist
- (if (not (eq property (car plist)))
- (setq p (plist-put p (car plist) (nth 1 plist))))
- (setq plist (cddr plist)))
- p))
-
-(defun use-package-plist-delete-first (plist property)
- "Delete PROPERTY from PLIST.
-This is in contrast to merely setting it to 0."
- (let (p)
- (while plist
- (if (eq property (car plist))
- (setq p (nconc p (cddr plist))
- plist nil)
- (setq p (nconc p (list (car plist) (cadr plist)))
- plist (cddr plist))))
- p))
-
-(defsubst use-package-plist-maybe-put (plist property value)
- "Add a VALUE for PROPERTY to PLIST, if it does not already exist."
- (if (plist-member plist property)
- plist
- (plist-put plist property value)))
-
-(defsubst use-package-plist-cons (plist property value)
- "Cons VALUE onto the head of the list at PROPERTY in PLIST."
- (plist-put plist property (cons value (plist-get plist property))))
-
-(defsubst use-package-plist-append (plist property value)
- "Append VALUE onto the front of the list at PROPERTY in PLIST."
- (plist-put plist property (append value (plist-get plist property))))
-
-(defun use-package-split-list (pred xs)
- (let ((ys (list nil)) (zs (list nil)) flip)
- (cl-dolist (x xs)
- (if flip
- (nconc zs (list x))
- (if (funcall pred x)
- (progn
- (setq flip t)
- (nconc zs (list x)))
- (nconc ys (list x)))))
- (cons (cdr ys) (cdr zs))))
-
-(defun use-package-split-list-at-keys (key lst)
- (and lst
- (let ((xs (use-package-split-list (apply-partially #'eq key) lst)))
- (cons (car xs) (use-package-split-list-at-keys key (cddr xs))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Keywords
-;;
-
-(defun use-package-keyword-index (keyword)
- (cl-loop named outer
- with index = 0
- for k in use-package-keywords do
- (if (eq k keyword)
- (cl-return-from outer index))
- (cl-incf index)))
-
-(defun use-package-normalize-plist (name input &optional plist merge-function)
- "Given a pseudo-plist, normalize it to a regular plist.
-The normalized key/value pairs from input are added to PLIST,
-extending any keys already present."
- (if (null input)
- plist
- (let* ((keyword (car input))
- (xs (use-package-split-list #'keywordp (cdr input)))
- (args (car xs))
- (tail (cdr xs))
- (normalizer
- (intern-soft (concat "use-package-normalize/"
- (symbol-name keyword))))
- (arg (and (functionp normalizer)
- (funcall normalizer name keyword args)))
- (error-string (format "Unrecognized keyword: %s" keyword)))
- (if (memq keyword use-package-keywords)
- (progn
- (setq plist (use-package-normalize-plist
- name tail plist merge-function))
- (plist-put plist keyword
- (if (plist-member plist keyword)
- (funcall merge-function keyword arg
- (plist-get plist keyword))
- arg)))
- (if use-package-ignore-unknown-keywords
- (progn
- (display-warning 'use-package error-string)
- (use-package-normalize-plist
- name tail plist merge-function))
- (use-package-error error-string))))))
-
-(defun use-package-unalias-keywords (_name args)
- (setq args (cl-nsubstitute :if :when args))
- (let (temp)
- (while (setq temp (plist-get args :unless))
- (setq args (use-package-plist-delete-first args :unless)
- args (append args `(:if (not ,temp))))))
- args)
-
-(defun use-package-merge-keys (key new old)
- (let ((merger (assq key use-package-merge-key-alist)))
- (if merger
- (funcall (cdr merger) new old)
- (append new old))))
-
-(defun use-package-sort-keywords (plist)
- (let (plist-grouped)
- (while plist
- (push (cons (car plist) (cadr plist))
- plist-grouped)
- (setq plist (cddr plist)))
- (let (result)
- (cl-dolist
- (x
- (nreverse
- (sort plist-grouped
- #'(lambda (l r) (< (use-package-keyword-index (car l))
- (use-package-keyword-index (car r)))))))
- (setq result (cons (car x) (cons (cdr x) result))))
- result)))
-
-(defun use-package-normalize-keywords (name args)
- (let* ((name-symbol (if (stringp name) (intern name) name))
- (name-string (symbol-name name-symbol)))
-
- ;; The function `elisp--local-variables' inserts this unbound variable into
- ;; macro forms to determine the locally bound variables for
- ;; `elisp-completion-at-point'. It ends up throwing a lot of errors since it
- ;; can occupy the position of a keyword (or look like a second argument to a
- ;; keyword that takes one). Deleting it when it's at the top level should be
- ;; harmless since there should be no locally bound variables to discover
- ;; here anyway.
- (setq args (delq 'elisp--witness--lisp args))
-
- ;; Reduce the set of keywords down to its most fundamental expression.
- (setq args (use-package-unalias-keywords name-symbol args))
-
- ;; Normalize keyword values, coalescing multiple occurrences.
- (setq args (use-package-normalize-plist name-symbol args nil
- #'use-package-merge-keys))
-
- ;; Add default values for keywords not specified, when applicable.
- (cl-dolist (spec use-package-defaults)
- (when (let ((func (nth 2 spec)))
- (if (and func (functionp func))
- (funcall func name args)
- (eval func)))
- (setq args (use-package-plist-maybe-put
- args (nth 0 spec)
- (let ((func (nth 1 spec)))
- (if (and func (functionp func))
- (funcall func name args)
- (eval func)))))))
-
- ;; Determine any autoloads implied by the keywords used.
- (let ((iargs args)
- commands)
- (while iargs
- (when (keywordp (car iargs))
- (let ((autoloads
- (intern-soft (concat "use-package-autoloads/"
- (symbol-name (car iargs))))))
- (when (functionp autoloads)
- (setq commands
- ;; jww (2017-12-07): Right now we just ignored the type of
- ;; the autoload being requested, and assume they are all
- ;; `command'.
- (append (mapcar
- #'car
- (funcall autoloads name-symbol (car iargs)
- (cadr iargs)))
- commands)))))
- (setq iargs (cddr iargs)))
- (when commands
- (setq args
- ;; Like `use-package-plist-append', but removing duplicates.
- (plist-put args :commands
- (delete-dups
- (append commands (plist-get args :commands)))))))
-
- ;; If byte-compiling, pre-load the package so all its symbols are in
- ;; scope. This is done by prepending statements to the :preface.
- (when (bound-and-true-p byte-compile-current-file)
- (setq args
- (use-package-plist-append
- args :preface
- (use-package-concat
- (mapcar #'(lambda (var) `(defvar ,var))
- (plist-get args :defines))
- (mapcar #'(lambda (fn) `(declare-function ,fn ,name-string))
- (plist-get args :functions))
- `((eval-when-compile
- (with-demoted-errors
- ,(format "Cannot load %s: %%S" name-string)
- ,(when (eq use-package-verbose 'debug)
- `(message ,(format "Compiling package %s" name-string)))
- ,(unless (plist-get args :no-require)
- `(unless (featurep ',name-symbol)
- (load ,name-string nil t))))))))))
-
- ;; Certain keywords imply :defer, if :demand was not specified.
- (when (and (not (plist-member args :demand))
- (not (plist-member args :defer))
- (not (or (equal '(t) (plist-get args :load))
- (equal (list (use-package-as-string name))
- (mapcar #'use-package-as-string
- (plist-get args :load)))))
- (cl-some #'identity
- (mapcar (apply-partially #'plist-member args)
- use-package-deferring-keywords)))
- (setq args (append args '(:defer t))))
-
- ;; The :load keyword overrides :no-require
- (when (and (plist-member args :load)
- (plist-member args :no-require))
- (setq args (use-package-plist-delete args :no-require)))
-
- ;; If at this point no :load, :defer or :no-require has been seen, then
- ;; :load the package itself.
- (when (and (not (plist-member args :load))
- (not (plist-member args :defer))
- (not (plist-member args :no-require)))
- (setq args (append args `(:load (,name)))))
-
- ;; Sort the list of keywords based on the order of `use-package-keywords'.
- (use-package-sort-keywords args)))
-
-(defun use-package-process-keywords (name plist &optional state)
- "Process the next keyword in the free-form property list PLIST.
-The values in the PLIST have each been normalized by the function
-use-package-normalize/KEYWORD (minus the colon).
-
-STATE is a property list that the function may modify and/or
-query. This is useful if a package defines multiple keywords and
-wishes them to have some kind of stateful interaction.
-
-Unless the KEYWORD being processed intends to ignore remaining
-keywords, it must call this function recursively, passing in the
-plist with its keyword and argument removed, and passing in the
-next value for the STATE."
- (declare (indent 1))
- (unless (null plist)
- (let* ((keyword (car plist))
- (arg (cadr plist))
- (rest (cddr plist)))
- (unless (keywordp keyword)
- (use-package-error (format "%s is not a keyword" keyword)))
- (let* ((handler (concat "use-package-handler/" (symbol-name keyword)))
- (handler-sym (intern handler)))
- (if (functionp handler-sym)
- (funcall handler-sym name keyword arg rest state)
- (use-package-error
- (format "Keyword handler not defined: %s" handler)))))))
-
-(put 'use-package-process-keywords 'lisp-indent-function 'defun)
-
-(defun use-package-list-insert (elem xs &optional anchor after test)
- "Insert ELEM into the list XS.
-If ANCHOR is also a keyword, place the new KEYWORD before that
-one.
-If AFTER is non-nil, insert KEYWORD either at the end of the
-keywords list, or after the ANCHOR if one has been provided.
-If TEST is non-nil, it is the test used to compare ELEM to list
-elements. The default is `eq'.
-The modified list is returned. The original list is not modified."
- (let (result)
- (dolist (k xs)
- (if (funcall (or test #'eq) k anchor)
- (if after
- (setq result (cons k result)
- result (cons elem result))
- (setq result (cons elem result)
- result (cons k result)))
- (setq result (cons k result))))
- (if anchor
- (nreverse result)
- (if after
- (nreverse (cons elem result))
- (cons elem (nreverse result))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Argument Processing
-;;
-
-(defun use-package-only-one (label args f)
- "Call F on the first member of ARGS if it has exactly one element."
- (declare (indent 1))
- (cond
- ((and (listp args) (listp (cdr args))
- (= (length args) 1))
- (funcall f label (car args)))
- (t
- (use-package-error
- (concat label " wants exactly one argument")))))
-
-(put 'use-package-only-one 'lisp-indent-function 'defun)
-
-(defun use-package-as-one (label args f &optional allow-empty)
- "Call F on the first element of ARGS if it has one element, or all of ARGS.
-If ALLOW-EMPTY is non-nil, it's OK for ARGS to be an empty list."
- (declare (indent 1))
- (if (if args
- (and (listp args) (listp (cdr args)))
- allow-empty)
- (if (= (length args) 1)
- (funcall f label (car args))
- (funcall f label args))
- (use-package-error
- (concat label " wants a non-empty list"))))
-
-(put 'use-package-as-one 'lisp-indent-function 'defun)
-
-(defun use-package-memoize (f arg)
- "Ensure the macro-expansion of F applied to ARG evaluates ARG
-no more than once."
- (let ((loaded (cl-gentemp "use-package--loaded"))
- (result (cl-gentemp "use-package--result"))
- (next (cl-gentemp "use-package--next")))
- `((defvar ,loaded nil)
- (defvar ,result nil)
- (defvar ,next #'(lambda () (if ,loaded ,result
- (setq ,loaded t ,result ,arg))))
- ,@(funcall f `((funcall ,next))))))
-
-(defsubst use-package-normalize-value (_label arg)
- "Normalize the Lisp value given by ARG.
-The argument LABEL is ignored."
- (cond ((null arg) nil)
- ((eq t arg) t)
- ((use-package-non-nil-symbolp arg)
- `(symbol-value ',arg))
- ((functionp arg)
- `(funcall #',arg))
- (t arg)))
-
-(defun use-package-normalize-symbols (label arg &optional recursed)
- "Normalize a list of symbols."
- (cond
- ((use-package-non-nil-symbolp arg)
- (list arg))
- ((and (not recursed) (listp arg) (listp (cdr arg)))
- (mapcar #'(lambda (x) (car (use-package-normalize-symbols label x t))) arg))
- (t
- (use-package-error
- (concat label " wants a symbol, or list of symbols")))))
-
-(defun use-package-normalize-symlist (_name keyword args)
- (use-package-as-one (symbol-name keyword) args
- #'use-package-normalize-symbols))
-
-(defun use-package-normalize-recursive-symbols (label arg)
- "Normalize a list of symbols."
- (cond
- ((use-package-non-nil-symbolp arg)
- arg)
- ((and (listp arg) (listp (cdr arg)))
- (mapcar #'(lambda (x) (use-package-normalize-recursive-symbols label x))
- arg))
- (t
- (use-package-error
- (concat label " wants a symbol, or nested list of symbols")))))
-
-(defun use-package-normalize-recursive-symlist (_name keyword args)
- (use-package-as-one (symbol-name keyword) args
- #'use-package-normalize-recursive-symbols))
-
-(defun use-package-normalize-paths (label arg &optional recursed)
- "Normalize a list of filesystem paths."
- (cond
- ((and arg (or (use-package-non-nil-symbolp arg) (functionp arg)))
- (let ((value (use-package-normalize-value label arg)))
- (use-package-normalize-paths label (eval value))))
- ((stringp arg)
- (let ((path (if (file-name-absolute-p arg)
- arg
- (expand-file-name arg user-emacs-directory))))
- (list path)))
- ((and (not recursed) (listp arg) (listp (cdr arg)))
- (mapcar #'(lambda (x)
- (car (use-package-normalize-paths label x t))) arg))
- (t
- (use-package-error
- (concat label " wants a directory path, or list of paths")))))
-
-(defun use-package-normalize-predicate (_name keyword args)
- (if (null args)
- t
- (use-package-only-one (symbol-name keyword) args
- #'use-package-normalize-value)))
-
-(defun use-package-normalize-form (label args)
- "Given a list of forms, return it wrapped in `progn'."
- (unless (listp (car args))
- (use-package-error (concat label " wants a sexp or list of sexps")))
- (mapcar #'(lambda (form)
- (if (and (consp form)
- (memq (car form)
- '(use-package bind-key bind-key*
- unbind-key bind-keys bind-keys*)))
- (macroexpand form)
- form)) args))
-
-(defun use-package-normalize-forms (_name keyword args)
- (use-package-normalize-form (symbol-name keyword) args))
-
-(defun use-package-normalize-pairs
- (key-pred val-pred name label arg &optional recursed)
- "Normalize a list of pairs.
-KEY-PRED and VAL-PRED are predicates recognizing valid keys and
-values, respectively.
-If RECURSED is non-nil, recurse into sublists."
- (cond
- ((funcall key-pred arg)
- (list (cons arg (use-package-as-symbol name))))
- ((use-package-is-pair arg key-pred val-pred)
- (list arg))
- ((and (not recursed) (listp arg) (listp (cdr arg)))
- (let (last-item)
- (mapcar
- #'(lambda (x)
- (prog1
- (let ((ret (use-package-normalize-pairs
- key-pred val-pred name label x t)))
- (if (and (listp ret)
- (not (keywordp last-item)))
- (car ret)
- ret))
- (setq last-item x))) arg)))
- (t arg)))
-
-(defun use-package-recognize-function (v &optional binding additional-pred)
- "A predicate that recognizes functional constructions:
- nil
- sym
- \\='sym
- (quote sym)
- #\\='sym
- (function sym)
- (lambda () ...)
- \\='(lambda () ...)
- (quote (lambda () ...))
- #\\='(lambda () ...)
- (function (lambda () ...))"
- (or (if binding
- (symbolp v)
- (use-package-non-nil-symbolp v))
- (and (listp v)
- (memq (car v) '(quote function))
- (use-package-non-nil-symbolp (cadr v)))
- (if binding (commandp v) (functionp v))
- (and additional-pred
- (funcall additional-pred v))))
-
-(defun use-package-normalize-function (v)
- "Reduce functional constructions to one of two normal forms:
- sym
- #\\='(lambda () ...)"
- (cond ((symbolp v) v)
- ((and (listp v)
- (memq (car v) '(quote function))
- (use-package-non-nil-symbolp (cadr v)))
- (cadr v))
- ((and (consp v)
- (eq 'lambda (car v)))
- v)
- ((and (listp v)
- (memq (car v) '(quote function))
- (eq 'lambda (car (cadr v))))
- (cadr v))
- (t v)))
-
-(defun use-package-normalize-commands (args)
- "Map over ARGS of the form ((_ . F) ...), normalizing functional F's."
- (mapcar #'(lambda (x)
- (if (consp x)
- (cons (car x) (use-package-normalize-function (cdr x)))
- x))
- args))
-
-(defun use-package-normalize-mode (name keyword args)
- "Normalize arguments for keywords which add regexp/mode pairs to an alist."
- (use-package-as-one (symbol-name keyword) args
- (apply-partially #'use-package-normalize-pairs
- #'use-package-regex-p
- #'use-package-recognize-function
- name)))
-
-(defun use-package-autoloads-mode (_name _keyword args)
- (mapcar
- #'(lambda (x) (cons (cdr x) 'command))
- (cl-remove-if-not #'(lambda (x)
- (and (consp x)
- (use-package-non-nil-symbolp (cdr x))))
- args)))
-
-(defun use-package-handle-mode (name alist args rest state)
- "Handle keywords which add regexp/mode pairs to an alist."
- (use-package-concat
- (use-package-process-keywords name rest state)
- (mapcar
- #'(lambda (thing)
- `(add-to-list
- ',alist
- ',(cons (use-package-normalize-regex (car thing))
- (cdr thing))))
- (use-package-normalize-commands args))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Statistics
-;;
-
-(defun use-package-reset-statistics ()
- "Reset statistics for `use-package'.
-See also `use-package-statistics'."
- (interactive)
- (setq use-package-statistics (make-hash-table)))
-
-(defun use-package-statistics-status (package)
- "Return loading configuration status of PACKAGE statistics."
- (cond ((gethash :config package) "Configured")
- ((gethash :init package) "Initialized")
- ((gethash :preface package) "Prefaced")
- ((gethash :use-package package) "Declared")))
-
-(defun use-package-statistics-last-event (package)
- "Return the date when PACKAGE's status last changed.
-The date is returned as a string."
- (or (gethash :config package)
- (gethash :init package)
- (gethash :preface package)
- (gethash :use-package package)))
-
-(defun use-package-statistics-time (package)
- "Return the time is took for PACKAGE to load."
- (+ (float-time (gethash :config-secs package '(0 0 0 0)))
- (float-time (gethash :init-secs package '(0 0 0 0)))
- (float-time (gethash :preface-secs package '(0 0 0 0)))
- (float-time (gethash :use-package-secs package '(0 0 0 0)))))
-
-(defun use-package-statistics-convert (package)
- "Return information about PACKAGE.
-
-The information is formatted in a way suitable for
-`use-package-statistics-mode'."
- (let ((statistics (gethash package use-package-statistics)))
- (list
- package
- (vector
- (symbol-name package)
- (use-package-statistics-status statistics)
- (format-time-string
- "%H:%M:%S.%6N"
- (use-package-statistics-last-event statistics))
- (format "%.2f" (use-package-statistics-time statistics))))))
-
-(defun use-package-report ()
- "Show current statistics gathered about `use-package' declarations.
-In the table that's generated, the status field has the following
-meaning:
- Configured :config has been processed (the package is loaded!)
- Initialized :init has been processed (load status unknown)
- Prefaced :preface has been processed
- Declared the use-package declaration was seen"
- (interactive)
- (with-current-buffer (get-buffer-create "*use-package statistics*")
- (setq tabulated-list-entries
- (mapcar #'use-package-statistics-convert
- (hash-table-keys use-package-statistics)))
- (use-package-statistics-mode)
- (tabulated-list-print)
- (display-buffer (current-buffer))))
-
-(defvar use-package-statistics-status-order
- '(("Declared" . 0)
- ("Prefaced" . 1)
- ("Initialized" . 2)
- ("Configured" . 3)))
-
-(define-derived-mode use-package-statistics-mode tabulated-list-mode
- "use-package statistics"
- "Show current statistics gathered about `use-package' declarations."
- (setq tabulated-list-format
- ;; The sum of column width is 80 characters:
- [("Package" 25 t)
- ("Status" 13
- (lambda (a b)
- (< (assoc-default
- (use-package-statistics-status
- (gethash (car a) use-package-statistics))
- use-package-statistics-status-order)
- (assoc-default
- (use-package-statistics-status
- (gethash (car b) use-package-statistics))
- use-package-statistics-status-order))))
- ("Last Event" 23
- (lambda (a b)
- (< (float-time
- (use-package-statistics-last-event
- (gethash (car a) use-package-statistics)))
- (float-time
- (use-package-statistics-last-event
- (gethash (car b) use-package-statistics))))))
- ("Time" 10
- (lambda (a b)
- (< (use-package-statistics-time
- (gethash (car a) use-package-statistics))
- (use-package-statistics-time
- (gethash (car b) use-package-statistics)))))])
- (setq tabulated-list-sort-key '("Time" . t))
- (tabulated-list-init-header))
-
-(defun use-package-statistics-gather (keyword name after)
- (let* ((hash (gethash name use-package-statistics
- (make-hash-table)))
- (before (and after (gethash keyword hash (current-time)))))
- (puthash keyword (current-time) hash)
- (when after
- (puthash (intern (concat (symbol-name keyword) "-secs"))
- (time-subtract (current-time) before) hash))
- (puthash name hash use-package-statistics)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Handlers
-;;
-
-;;;; :disabled
-
-;; Don't alias this to `ignore', as that will cause the resulting
-;; function to be interactive.
-(defun use-package-normalize/:disabled (_name _keyword _arg)
- "Do nothing, return nil.")
-
-(defun use-package-handler/:disabled (name _keyword _arg rest state)
- (use-package-process-keywords name rest state))
-
-;;;; :if, :when and :unless
-
-(defun use-package-normalize-test (_name keyword args)
- (use-package-only-one (symbol-name keyword) args
- #'use-package-normalize-value))
-
-(defalias 'use-package-normalize/:if 'use-package-normalize-test)
-
-(defun use-package-handler/:if (name _keyword pred rest state)
- (let ((body (use-package-process-keywords name rest state)))
- `((when ,pred ,@body))))
-
-(defalias 'use-package-normalize/:when 'use-package-normalize-test)
-
-(defalias 'use-package-handler/:when 'use-package-handler/:if)
-
-(defalias 'use-package-normalize/:unless 'use-package-normalize-test)
-
-(defun use-package-handler/:unless (name _keyword pred rest state)
- (let ((body (use-package-process-keywords name rest state)))
- `((unless ,pred ,@body))))
-
-;;;; :requires
-
-(defalias 'use-package-normalize/:requires 'use-package-normalize-symlist)
-
-(defun use-package-handler/:requires (name _keyword requires rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (if (null requires)
- body
- `((when ,(if (> (length requires) 1)
- `(not (member nil (mapcar #'featurep ',requires)))
- `(featurep ',(car requires)))
- ,@body)))))
-
-;;;; :load-path
-
-(defun use-package-normalize/:load-path (_name keyword args)
- (use-package-as-one (symbol-name keyword) args
- #'use-package-normalize-paths))
-
-(defun use-package-handler/:load-path (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- (mapcar #'(lambda (path)
- `(eval-and-compile (add-to-list 'load-path ,path)))
- arg)
- body)))
-
-;;;; :no-require
-
-(defalias 'use-package-normalize/:no-require 'use-package-normalize-predicate)
-
-(defun use-package-handler/:no-require (name _keyword _arg rest state)
- (use-package-process-keywords name rest state))
-
-;;;; :defines
-
-(defalias 'use-package-normalize/:defines 'use-package-normalize-symlist)
-
-(defun use-package-handler/:defines (name _keyword _arg rest state)
- (use-package-process-keywords name rest state))
-
-;;;; :functions
-
-(defalias 'use-package-normalize/:functions 'use-package-normalize-symlist)
-
-(defun use-package-handler/:functions (name _keyword _arg rest state)
- (use-package-process-keywords name rest state))
-
-;;;; :preface
-
-(defalias 'use-package-normalize/:preface 'use-package-normalize-forms)
-
-(defun use-package-handler/:preface (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- (when use-package-compute-statistics
- `((use-package-statistics-gather :preface ',name nil)))
- (when arg
- `((eval-and-compile ,@arg)))
- body
- (when use-package-compute-statistics
- `((use-package-statistics-gather :preface ',name t))))))
-
-;;;; :catch
-
-(defvar use-package--form)
-(defvar use-package--hush-function #'(lambda (_keyword body) body))
-
-(defsubst use-package-hush (context keyword body)
- `((condition-case-unless-debug err
- ,(macroexp-progn body)
- (error (funcall ,context ,keyword err)))))
-
-(defun use-package-normalize/:catch (_name keyword args)
- (if (null args)
- t
- (use-package-only-one (symbol-name keyword) args
- use-package--hush-function)))
-
-(defun use-package-handler/:catch (name keyword arg rest state)
- (let* ((context (cl-gentemp "use-package--warning")))
- (cond
- ((not arg)
- (use-package-process-keywords name rest state))
- ((eq arg t)
- `((defvar ,context
- #'(lambda (keyword err)
- (let ((msg (format "%s/%s: %s" ',name keyword
- (error-message-string err))))
- ,@(when (eq use-package-verbose 'debug)
- `((with-current-buffer
- (get-buffer-create "*use-package*")
- (goto-char (point-max))
- (insert "-----\n" msg ,use-package--form)
- (emacs-lisp-mode))
- (setq msg
- (concat msg
- " (see the *use-package* buffer)"))))
- (display-warning 'use-package msg :error))))
- ,@(let ((use-package--hush-function
- (apply-partially #'use-package-hush context)))
- (funcall use-package--hush-function keyword
- (use-package-process-keywords name rest state)))))
- ((functionp arg)
- `((defvar ,context ,arg)
- ,@(let ((use-package--hush-function
- (apply-partially #'use-package-hush context)))
- (funcall use-package--hush-function keyword
- (use-package-process-keywords name rest state)))))
- (t
- (use-package-error "The :catch keyword expects 't' or a function")))))
-
-;;;; :interpreter
-
-(defalias 'use-package-normalize/:interpreter 'use-package-normalize-mode)
-(defalias 'use-package-autoloads/:interpreter 'use-package-autoloads-mode)
-
-(defun use-package-handler/:interpreter (name _keyword arg rest state)
- (use-package-handle-mode name 'interpreter-mode-alist arg rest state))
-
-;;;; :mode
-
-(defalias 'use-package-normalize/:mode 'use-package-normalize-mode)
-(defalias 'use-package-autoloads/:mode 'use-package-autoloads-mode)
-
-(defun use-package-handler/:mode (name _keyword arg rest state)
- (use-package-handle-mode name 'auto-mode-alist arg rest state))
-
-;;;; :magic
-
-(defalias 'use-package-normalize/:magic 'use-package-normalize-mode)
-(defalias 'use-package-autoloads/:magic 'use-package-autoloads-mode)
-
-(defun use-package-handler/:magic (name _keyword arg rest state)
- (use-package-handle-mode name 'magic-mode-alist arg rest state))
-
-;;;; :magic-fallback
-
-(defalias 'use-package-normalize/:magic-fallback 'use-package-normalize-mode)
-(defalias 'use-package-autoloads/:magic-fallback 'use-package-autoloads-mode)
-
-(defun use-package-handler/:magic-fallback (name _keyword arg rest state)
- (use-package-handle-mode name 'magic-fallback-mode-alist arg rest state))
-
-;;;; :hook
-
-(defun use-package-normalize/:hook (name keyword args)
- (use-package-as-one (symbol-name keyword) args
- #'(lambda (label arg)
- (unless (or (use-package-non-nil-symbolp arg) (consp arg))
- (use-package-error
- (concat label " a or ( . )"
- " or list of these")))
- (use-package-normalize-pairs
- #'(lambda (k)
- (or (use-package-non-nil-symbolp k)
- (and k (let ((every t))
- (while (and every k)
- (if (and (consp k)
- (use-package-non-nil-symbolp (car k)))
- (setq k (cdr k))
- (setq every nil)))
- every))))
- #'use-package-recognize-function
- (if (string-suffix-p "-mode" (symbol-name name))
- name
- (intern (concat (symbol-name name) "-mode")))
- label arg))))
-
-(defalias 'use-package-autoloads/:hook 'use-package-autoloads-mode)
-
-(defun use-package-handler/:hook (name _keyword args rest state)
- "Generate use-package custom keyword code."
- (use-package-concat
- (use-package-process-keywords name rest state)
- (cl-mapcan
- #'(lambda (def)
- (let ((syms (car def))
- (fun (cdr def)))
- (when fun
- (mapcar
- #'(lambda (sym)
- `(add-hook
- (quote ,(intern
- (concat (symbol-name sym)
- use-package-hook-name-suffix)))
- (function ,fun)))
- (use-package-hook-handler-normalize-mode-symbols syms)))))
- (use-package-normalize-commands args))))
-
-(defun use-package-hook-handler-normalize-mode-symbols (syms)
- "Ensure that `SYMS' turns into a list of modes."
- (if (use-package-non-nil-symbolp syms) (list syms) syms))
-
-;;;; :commands
-
-(defalias 'use-package-normalize/:commands 'use-package-normalize-symlist)
-
-(defun use-package-handler/:commands (name _keyword arg rest state)
- (use-package-concat
- ;; Since we deferring load, establish any necessary autoloads, and also
- ;; keep the byte-compiler happy.
- (let ((name-string (use-package-as-string name)))
- (cl-mapcan
- #'(lambda (command)
- (when (symbolp command)
- (append
- (unless (plist-get state :demand)
- `((unless (fboundp ',command)
- (autoload #',command ,name-string nil t))))
- (when (bound-and-true-p byte-compile-current-file)
- `((eval-when-compile
- (declare-function ,command ,name-string)))))))
- (delete-dups arg)))
- (use-package-process-keywords name rest state)))
-
-;;;; :autoload
-
-(defalias 'use-package-normalize/:autoload 'use-package-normalize/:commands)
-
-(defun use-package-handler/:autoload (name _keyword arg rest state)
- (use-package-concat
- ;; Since we deferring load, establish any necessary autoloads, and also
- ;; keep the byte-compiler happy.
- (let ((name-string (use-package-as-string name)))
- (cl-mapcan
- #'(lambda (command)
- (when (symbolp command)
- (append
- (unless (plist-get state :demand)
- `((unless (fboundp ',command)
- (autoload #',command ,name-string))))
- (when (bound-and-true-p byte-compile-current-file)
- `((eval-when-compile
- (declare-function ,command ,name-string)))))))
- (delete-dups arg)))
- (use-package-process-keywords name rest state)))
-
-;;;; :defer
-
-(defalias 'use-package-normalize/:defer 'use-package-normalize-predicate)
-
-(defun use-package-handler/:defer (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- ;; Load the package after a set amount of idle time, if the argument to
- ;; `:defer' was a number.
- (when (numberp arg)
- `((run-with-idle-timer ,arg nil #'require
- ',(use-package-as-symbol name) nil t)))
- (if (or (not arg) (null body))
- body
- `((eval-after-load ',name ',(macroexp-progn body)))))))
-
-;;;; :after
-
-(defun use-package-normalize/:after (name keyword args)
- (setq args (use-package-normalize-recursive-symlist name keyword args))
- (if (consp args)
- args
- (list args)))
-
-(defun use-package-after-count-uses (features*)
- "Count the number of time the body would appear in the result."
- (cond ((use-package-non-nil-symbolp features*)
- 1)
- ((and (consp features*)
- (memq (car features*) '(:or :any)))
- (let ((num 0))
- (cl-dolist (next (cdr features*))
- (setq num (+ num (use-package-after-count-uses next))))
- num))
- ((and (consp features*)
- (memq (car features*) '(:and :all)))
- (apply #'max (mapcar #'use-package-after-count-uses
- (cdr features*))))
- ((listp features*)
- (use-package-after-count-uses (cons :all features*)))))
-
-(defun use-package-require-after-load (features* body)
- "Generate `eval-after-load' statements to represents FEATURES*.
-FEATURES* is a list containing keywords `:and' and `:all', where
-no keyword implies `:all'."
- (cond
- ((use-package-non-nil-symbolp features*)
- `((eval-after-load ',features* ',(macroexp-progn body))))
- ((and (consp features*)
- (memq (car features*) '(:or :any)))
- (cl-mapcan #'(lambda (x) (use-package-require-after-load x body))
- (cdr features*)))
- ((and (consp features*)
- (memq (car features*) '(:and :all)))
- (cl-dolist (next (cdr features*))
- (setq body (use-package-require-after-load next body)))
- body)
- ((listp features*)
- (use-package-require-after-load (cons :all features*) body))))
-
-(defun use-package-handler/:after (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state))
- (uses (use-package-after-count-uses arg)))
- (if (or (null uses) (null body))
- body
- (if (<= uses 1)
- (use-package-require-after-load arg body)
- (use-package-memoize
- (apply-partially #'use-package-require-after-load arg)
- (macroexp-progn body))))))
-
-;;;; :demand
-
-(defalias 'use-package-normalize/:demand 'use-package-normalize-predicate)
-
-(defun use-package-handler/:demand (name _keyword _arg rest state)
- (use-package-process-keywords name rest state))
-
-;;;; :custom
-
-(defun use-package-normalize/:custom (_name keyword args)
- "Normalize use-package custom keyword."
- (use-package-as-one (symbol-name keyword) args
- #'(lambda (label arg)
- (unless (listp arg)
- (use-package-error
- (concat label " a ( [comment])"
- " or list of these")))
- (if (use-package-non-nil-symbolp (car arg))
- (list arg)
- arg))))
-
-(defun use-package-handler/:custom (name _keyword args rest state)
- "Generate use-package custom keyword code."
- (use-package-concat
- (if (bound-and-true-p use-package-use-theme)
- `((let ((custom--inhibit-theme-enable nil))
- ;; Declare the theme here so use-package can be required inside
- ;; eval-and-compile without warnings about unknown theme.
- (unless (memq 'use-package custom-known-themes)
- (deftheme use-package)
- (enable-theme 'use-package)
- (setq custom-enabled-themes (remq 'use-package custom-enabled-themes)))
- (custom-theme-set-variables
- 'use-package
- ,@(mapcar
- #'(lambda (def)
- (let ((variable (nth 0 def))
- (value (nth 1 def))
- (comment (nth 2 def)))
- (unless (and comment (stringp comment))
- (setq comment (format "Customized with use-package %s" name)))
- `'(,variable ,value nil () ,comment)))
- args))))
- (mapcar
- #'(lambda (def)
- (let ((variable (nth 0 def))
- (value (nth 1 def))
- (comment (nth 2 def)))
- (unless (and comment (stringp comment))
- (setq comment (format "Customized with use-package %s" name)))
- `(customize-set-variable (quote ,variable) ,value ,comment)))
- args))
- (use-package-process-keywords name rest state)))
-
-;;;; :custom-face
-
-(defun use-package-normalize/:custom-face (name-symbol _keyword arg)
- "Normalize use-package custom-face keyword."
- (let ((error-msg
- (format "%s wants a ( [spec-type]) or list of these"
- name-symbol)))
- (unless (listp arg)
- (use-package-error error-msg))
- (cl-dolist (def arg arg)
- (unless (listp def)
- (use-package-error error-msg))
- (let ((face (nth 0 def))
- (spec (nth 1 def)))
- (when (or (not face)
- (not spec)
- (> (length def) 3))
- (use-package-error error-msg))))))
-
-(defun use-package-handler/:custom-face (name _keyword args rest state)
- "Generate use-package custom-face keyword code."
- (use-package-concat
- (mapcar #'(lambda (def) `(apply #'face-spec-set (backquote ,def))) args)
- (use-package-process-keywords name rest state)))
-
-;;;; :init
-
-(defalias 'use-package-normalize/:init 'use-package-normalize-forms)
-
-(defun use-package-handler/:init (name _keyword arg rest state)
- (use-package-concat
- (when use-package-compute-statistics
- `((use-package-statistics-gather :init ',name nil)))
- (let ((init-body
- (use-package-hook-injector (use-package-as-string name)
- :init arg)))
- (when init-body
- (funcall use-package--hush-function :init
- (if use-package-check-before-init
- `((when (locate-library ,(use-package-as-string name))
- ,@init-body))
- init-body))))
- (use-package-process-keywords name rest state)
- (when use-package-compute-statistics
- `((use-package-statistics-gather :init ',name t)))))
-
-;;;; :load
-
-(defun use-package-normalize/:load (name keyword args)
- (setq args (use-package-normalize-recursive-symlist name keyword args))
- (if (consp args)
- args
- (list args)))
-
-(defun use-package-handler/:load (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (cl-dolist (pkg arg)
- (setq body (use-package-require (if (eq t pkg) name pkg) nil body)))
- body))
-
-;;;; :config
-
-(defalias 'use-package-normalize/:config 'use-package-normalize-forms)
-
-(defun use-package-handler/:config (name _keyword arg rest state)
- (let* ((body (use-package-process-keywords name rest state))
- (name-symbol (use-package-as-symbol name)))
- (use-package-concat
- (when use-package-compute-statistics
- `((use-package-statistics-gather :config ',name nil)))
- (if (and (or (null arg) (equal arg '(t))) (not use-package-inject-hooks))
- body
- (use-package-with-elapsed-timer
- (format "Configuring package %s" name-symbol)
- (funcall use-package--hush-function :config
- (use-package-concat
- (use-package-hook-injector
- (symbol-name name-symbol) :config arg)
- body
- (list t)))))
- (when use-package-compute-statistics
- `((use-package-statistics-gather :config ',name t))))))
-
-;;;; :local
-
-(defun use-package-normalize/:local (name keyword args)
- (let ((first-arg-name (symbol-name (caar args))))
- (if (not (string-suffix-p "-hook" first-arg-name))
- (let* ((sym-name (symbol-name name))
- (addition (if (string-suffix-p "-mode" sym-name)
- "-hook"
- "-mode-hook"))
- (hook (intern (concat sym-name addition))))
- `((,hook . ,(use-package-normalize-forms name keyword args))))
- (cl-loop for (hook . code) in args
- collect `(,hook . ,(use-package-normalize-forms name keyword code))))))
-
-(defun use-package-handler/:local (name _keyword arg rest state)
- (let* ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- body
- (cl-loop for (hook . code) in arg
- for func-name = (intern (concat "use-package-func/" (symbol-name hook)))
- collect (progn
- (push 'progn code)
- `(defun ,func-name () ,code))
- collect `(add-hook ',hook ',func-name)))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; The main macro
-;;
-
-(defmacro use-package-core (name args)
- `(let* ((args* (use-package-normalize-keywords ,name ,args))
- (use-package--form
- (if (eq use-package-verbose 'debug)
- (concat "\n\n"
- (pp-to-string `(use-package ,name ,@,args))
- "\n -->\n\n"
- (pp-to-string `(use-package ,name ,@args*))
- "\n ==>\n\n"
- (pp-to-string
- (macroexp-progn
- (let ((use-package-verbose 'errors)
- (use-package-expand-minimally t))
- (use-package-process-keywords name args*
- (and (plist-get args* :demand)
- (list :demand t)))))))
- "")))
- (use-package-process-keywords name args*
- (and (plist-get args* :demand)
- (list :demand t)))))
-
-;;;###autoload
-(defmacro use-package (name &rest args)
- "Declare an Emacs package by specifying a group of configuration options.
-
-For full documentation, please see the README file that came with
-this file. Usage:
-
- (use-package package-name
- [:keyword [option]]...)
-
-:init Code to run before PACKAGE-NAME has been loaded.
-:config Code to run after PACKAGE-NAME has been loaded. Note that
- if loading is deferred for any reason, this code does not
- execute until the lazy load has occurred.
-:preface Code to be run before everything except `:disabled'; this
- can be used to define functions for use in `:if', or that
- should be seen by the byte-compiler.
-
-:mode Form to be added to `auto-mode-alist'.
-:magic Form to be added to `magic-mode-alist'.
-:magic-fallback Form to be added to `magic-fallback-mode-alist'.
-:interpreter Form to be added to `interpreter-mode-alist'.
-
-:commands Define autoloads for commands that will be defined by the
- package. This is useful if the package is being lazily
- loaded, and you wish to conditionally call functions in your
- `:init' block that are defined in the package.
-:autoload Similar to :commands, but it for no-interactive one.
-:hook Specify hook(s) to attach this package to.
-
-:bind Bind keys, and define autoloads for the bound commands.
-:bind* Bind keys, and define autoloads for the bound commands,
- *overriding all minor mode bindings*.
-:bind-keymap Bind a key prefix to an auto-loaded keymap defined in the
- package. This is like `:bind', but for keymaps.
-:bind-keymap* Like `:bind-keymap', but overrides all minor mode bindings
-
-:defer Defer loading of a package -- this is implied when using
- `:commands', `:bind', `:bind*', `:mode', `:magic', `:hook',
- `:magic-fallback', or `:interpreter'. This can be an integer,
- to force loading after N seconds of idle time, if the package
- has not already been loaded.
-:after Delay the use-package declaration until after the named modules
- have loaded. Once load, it will be as though the use-package
- declaration (without `:after') had been seen at that moment.
-:demand Prevent the automatic deferred loading introduced by constructs
- such as `:bind' (see `:defer' for the complete list).
-
-:if EXPR Initialize and load only if EXPR evaluates to a non-nil value.
-:disabled The package is ignored completely if this keyword is present.
-:defines Declare certain variables to silence the byte-compiler.
-:functions Declare certain functions to silence the byte-compiler.
-:load-path Add to the `load-path' before attempting to load the package.
-:diminish Support for diminish.el (if installed).
-:delight Support for delight.el (if installed).
-:custom Call `Custom-set' or `set-default' with each variable
- definition without modifying the Emacs `custom-file'.
- (compare with `custom-set-variables').
-:custom-face Call `custom-set-faces' with each face definition.
-:ensure Loads the package using package.el if necessary.
-:pin Pin the package to an archive."
- (declare (indent defun))
- (unless (memq :disabled args)
- (macroexp-progn
- (use-package-concat
- (when use-package-compute-statistics
- `((use-package-statistics-gather :use-package ',name nil)))
- (if (eq use-package-verbose 'errors)
- (use-package-core name args)
- (condition-case-unless-debug err
- (use-package-core name args)
- (error
- (ignore
- (display-warning
- 'use-package
- (format "Failed to parse package %s: %s"
- name (error-message-string err)) :error)))))
- (when use-package-compute-statistics
- `((use-package-statistics-gather :use-package ',name t)))))))
-
-(provide 'use-package-core)
-
-;;; use-package-core.el ends here
diff --git a/emacs.d/use-package/use-package-delight.el b/emacs.d/use-package/use-package-delight.el
deleted file mode 100644
index c6abac9..0000000
--- a/emacs.d/use-package/use-package-delight.el
+++ /dev/null
@@ -1,83 +0,0 @@
-;;; use-package-delight.el --- Support for the :delight keyword -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
-
-;; Author: John Wiegley
-;; Maintainer: John Wiegley
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;; Provides support for the :delight keyword, which is made available by
-;; default by requiring `use-package'.
-
-;;; Code:
-
-(require 'use-package-core)
-
-(defun use-package-normalize-delight (name args)
- "Normalize ARGS for a single call to `delight'."
- (when (eq :eval (car args))
- ;; Handle likely common mistake.
- (use-package-error ":delight mode line constructs must be quoted"))
- (cond ((and (= (length args) 1)
- (use-package-non-nil-symbolp (car args)))
- `(,(nth 0 args) nil ,name))
- ((= (length args) 2)
- `(,(nth 0 args) ,(nth 1 args) ,name))
- ((= (length args) 3)
- args)
- (t
- (use-package-error
- ":delight expects `delight' arguments or a list of them"))))
-
-;;;###autoload
-(defun use-package-normalize/:delight (name _keyword args)
- "Normalize arguments to delight."
- (cond ((null args)
- `((,(use-package-as-mode name) nil ,name)))
- ((and (= (length args) 1)
- (use-package-non-nil-symbolp (car args)))
- `((,(car args) nil ,name)))
- ((and (= (length args) 1)
- (stringp (car args)))
- `((,(use-package-as-mode name) ,(car args) ,name)))
- ((and (= (length args) 1)
- (listp (car args))
- (eq 'quote (caar args)))
- `((,(use-package-as-mode name) ,@(cdar args) ,name)))
- ((and (= (length args) 2)
- (listp (nth 1 args))
- (eq 'quote (car (nth 1 args))))
- `((,(car args) ,@(cdr (nth 1 args)) ,name)))
- (t (mapcar
- (apply-partially #'use-package-normalize-delight name)
- (if (use-package-non-nil-symbolp (car args))
- (list args)
- args)))))
-
-;;;###autoload
-(defun use-package-handler/:delight (name _keyword args rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- body
- `((if (fboundp 'delight)
- (delight '(,@args)))))))
-
-(add-to-list 'use-package-keywords :delight t)
-
-(provide 'use-package-delight)
-
-;;; use-package-delight.el ends here
diff --git a/emacs.d/use-package/use-package-diminish.el b/emacs.d/use-package/use-package-diminish.el
deleted file mode 100644
index 9b8a09a..0000000
--- a/emacs.d/use-package/use-package-diminish.el
+++ /dev/null
@@ -1,72 +0,0 @@
-;;; use-package-diminish.el --- Support for the :diminish keyword -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
-
-;; Author: John Wiegley
-;; Maintainer: John Wiegley
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;; Provides support for the :diminish keyword, which is made available by
-;; default by requiring `use-package'.
-
-;;; Code:
-
-(require 'use-package-core)
-
-(defun use-package-normalize-diminish (name label arg &optional recursed)
- "Normalize the arguments to diminish down to a list of one of two forms:
- SYMBOL
- (SYMBOL . STRING)"
- (cond
- ((not arg)
- (list (use-package-as-mode name)))
- ((use-package-non-nil-symbolp arg)
- (list arg))
- ((stringp arg)
- (list (cons (use-package-as-mode name) arg)))
- ((and (consp arg) (stringp (cdr arg)))
- (list arg))
- ((and (not recursed) (listp arg) (listp (cdr arg)))
- (mapcar #'(lambda (x) (car (use-package-normalize-diminish
- name label x t))) arg))
- (t
- (use-package-error
- (concat label " wants a string, symbol, "
- "(symbol . string) or list of these")))))
-
-;;;###autoload
-(defun use-package-normalize/:diminish (name keyword args)
- (use-package-as-one (symbol-name keyword) args
- (apply-partially #'use-package-normalize-diminish name) t))
-
-;;;###autoload
-(defun use-package-handler/:diminish (name _keyword arg rest state)
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- (mapcar #'(lambda (var)
- `(if (fboundp 'diminish)
- ,(if (consp var)
- `(diminish ',(car var) ,(cdr var))
- `(diminish ',var))))
- arg)
- body)))
-
-(add-to-list 'use-package-keywords :diminish t)
-
-(provide 'use-package-diminish)
-
-;;; use-package-diminish.el ends here
diff --git a/emacs.d/use-package/use-package-ensure-system-package.el b/emacs.d/use-package/use-package-ensure-system-package.el
deleted file mode 100644
index 9c9f079..0000000
--- a/emacs.d/use-package/use-package-ensure-system-package.el
+++ /dev/null
@@ -1,99 +0,0 @@
-;;; use-package-ensure-system-package.el --- auto install system packages -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2022 Free Software Foundation, Inc.
-
-;; Author: Justin Talbott
-;; Keywords: convenience, tools, extensions
-;; URL: https://github.com/waymondo/use-package-ensure-system-package
-;; Version: 0.2
-;; Package-Requires: ((use-package "2.1") (system-packages "1.0.4"))
-;; Filename: use-package-ensure-system-package.el
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-;;
-;; The `:ensure-system-package` keyword allows you to ensure system
-;; binaries exist alongside your `use-package` declarations.
-;;
-
-;;; Code:
-
-(require 'use-package)
-(require 'system-packages nil t)
-
-(eval-when-compile
- (declare-function system-packages-get-command "system-packages"))
-
-(defvar use-package-ensure-system-package--custom-packages '()
- "List of custom packages installed.")
-
-(defun use-package-ensure-system-package-consify (arg)
- "Turn ARG into a cons of (`package-name' . `install-command')."
- (cond
- ((stringp arg)
- (cons arg `(system-packages-install ,arg)))
- ((symbolp arg)
- (cons arg `(system-packages-install ,(symbol-name arg))))
- ((consp arg)
- (cond
- ((not (cdr arg))
- (use-package-ensure-system-package-consify (car arg)))
- ((stringp (cdr arg))
- (progn
- (push (cdr arg) use-package-ensure-system-package--custom-packages)
- (cons (car arg) `(async-shell-command ,(cdr arg)))))
- (t
- (cons (car arg)
- `(system-packages-install ,(symbol-name (cdr arg)))))))))
-
-(defun use-package-ensure-system-package-update-custom-packages ()
- (interactive)
- (dolist (cmd use-package-ensure-system-package--custom-packages)
- (async-shell-command cmd)))
-
-;;;###autoload
-(defun use-package-normalize/:ensure-system-package (_name-symbol keyword args)
- "Turn ARGS into a list of conses of (`package-name' . `install-command')."
- (use-package-as-one (symbol-name keyword) args
- (lambda (_label arg)
- (cond
- ((and (listp arg) (listp (cdr arg)))
- (mapcar #'use-package-ensure-system-package-consify arg))
- (t
- (list (use-package-ensure-system-package-consify arg)))))))
-
-(defun use-package-ensure-system-package-exists? (file-or-exe)
- "If variable is a string, ensure the file path exists.
-If it is a symbol, ensure the binary exist."
- (if (stringp file-or-exe)
- (file-exists-p file-or-exe)
- (executable-find (symbol-name file-or-exe))))
-
-
-;;;###autoload
-(defun use-package-handler/:ensure-system-package (name _keyword arg rest state)
- "Execute the handler for `:ensure-system-package' keyword in `use-package'."
- (let ((body (use-package-process-keywords name rest state)))
- (use-package-concat
- (mapcar #'(lambda (cons)
- `(unless (use-package-ensure-system-package-exists? ',(car cons))
- ,(cdr cons))) arg)
- body)))
-
-(add-to-list 'use-package-keywords :ensure-system-package t)
-
-(provide 'use-package-ensure-system-package)
-
-;;; use-package-ensure-system-package.el ends here
diff --git a/emacs.d/use-package/use-package-ensure.el b/emacs.d/use-package/use-package-ensure.el
deleted file mode 100644
index c9cc6e7..0000000
--- a/emacs.d/use-package/use-package-ensure.el
+++ /dev/null
@@ -1,206 +0,0 @@
-;;; use-package-ensure.el --- Support for the :ensure and :pin keywords -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
-
-;; Author: John Wiegley
-;; Maintainer: John Wiegley
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;; Provides support for the :ensure and :pin keywords, which is made available
-;; by default by requiring `use-package'.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'use-package-core)
-
-(defgroup use-package-ensure nil
- "Support for :ensure and :pin keywords in `use-package' declarations."
- :group 'use-package)
-
-(eval-when-compile
- (declare-function package-installed-p "package")
- (declare-function package-read-all-archive-contents "package" ()))
-
-(defcustom use-package-always-ensure nil
- "Treat every package as though it had specified using `:ensure SEXP'.
-See also `use-package-defaults', which uses this value."
- :type 'sexp
- :group 'use-package-ensure)
-
-(defcustom use-package-always-pin nil
- "Treat every package as though it had specified using `:pin SYM'.
-See also `use-package-defaults', which uses this value."
- :type 'symbol
- :group 'use-package-ensure)
-
-(defcustom use-package-ensure-function 'use-package-ensure-elpa
- "Function that ensures a package is installed.
-This function is called with three arguments: the name of the
-package declared in the `use-package' form; the arguments passed
-to all `:ensure' keywords (always a list, even if only one); and
-the current `state' plist created by previous handlers.
-
-Note that this function is called whenever `:ensure' is provided,
-even if it is nil. It is up to the function to decide on the
-semantics of the various values for `:ensure'.
-
-This function should return non-nil if the package is installed.
-
-The default value uses package.el to install the package."
- :type '(choice (const :tag "package.el" use-package-ensure-elpa)
- (function :tag "Custom"))
- :group 'use-package-ensure)
-
-;;;; :pin
-
-(defun use-package-normalize/:pin (_name keyword args)
- (use-package-only-one (symbol-name keyword) args
- #'(lambda (_label arg)
- (cond
- ((stringp arg) arg)
- ((use-package-non-nil-symbolp arg) (symbol-name arg))
- (t
- (use-package-error
- ":pin wants an archive name (a string)"))))))
-
-(eval-when-compile
- (defvar package-pinned-packages)
- (defvar package-archives))
-
-(defun use-package-archive-exists-p (archive)
- "Check if a given ARCHIVE is enabled.
-
-ARCHIVE can be a string or a symbol or `manual' to indicate a
-manually updated package."
- (if (member archive '(manual "manual"))
- 't
- (let ((valid nil))
- (dolist (pa package-archives)
- (when (member archive (list (car pa) (intern (car pa))))
- (setq valid 't)))
- valid)))
-
-(defun use-package-pin-package (package archive)
- "Pin PACKAGE to ARCHIVE."
- (unless (boundp 'package-pinned-packages)
- (setq package-pinned-packages ()))
- (let ((archive-symbol (if (symbolp archive) archive (intern archive)))
- (archive-name (if (stringp archive) archive (symbol-name archive))))
- (if (use-package-archive-exists-p archive-symbol)
- (add-to-list 'package-pinned-packages (cons package archive-name))
- (error "Archive '%s' requested for package '%s' is not available"
- archive-name package))
- (unless (bound-and-true-p package--initialized)
- (package-initialize t))))
-
-(defun use-package-handler/:pin (name _keyword archive-name rest state)
- (let ((body (use-package-process-keywords name rest state))
- (pin-form (if archive-name
- `(use-package-pin-package ',(use-package-as-symbol name)
- ,archive-name))))
- ;; Pinning should occur just before ensuring
- ;; See `use-package-handler/:ensure'.
- (if (bound-and-true-p byte-compile-current-file)
- (eval pin-form) ; Eval when byte-compiling,
- (push pin-form body)) ; or else wait until runtime.
- body))
-
-;;;; :ensure
-
-(defvar package-archive-contents)
-
-;;;###autoload
-(defun use-package-normalize/:ensure (_name keyword args)
- (if (null args)
- (list t)
- (use-package-only-one (symbol-name keyword) args
- #'(lambda (_label arg)
- (cond
- ((symbolp arg)
- (list arg))
- ((and (listp arg) (= 3 (length arg))
- (symbolp (nth 0 arg))
- (eq :pin (nth 1 arg))
- (or (stringp (nth 2 arg))
- (symbolp (nth 2 arg))))
- (list (cons (nth 0 arg) (nth 2 arg))))
- (t
- (use-package-error
- (concat ":ensure wants an optional package name "
- "(an unquoted symbol name), or ( :pin )"))))))))
-
-(defun use-package-ensure-elpa (name args _state &optional _no-refresh)
- (dolist (ensure args)
- (let ((package
- (or (and (eq ensure t) (use-package-as-symbol name))
- ensure)))
- (when package
- (require 'package)
- (when (consp package)
- (use-package-pin-package (car package) (cdr package))
- (setq package (car package)))
- (unless (package-installed-p package)
- (condition-case-unless-debug err
- (progn
- (when (assoc package (bound-and-true-p
- package-pinned-packages))
- (package-read-all-archive-contents))
- (if (assoc package package-archive-contents)
- (package-install package)
- (package-refresh-contents)
- (when (assoc package (bound-and-true-p
- package-pinned-packages))
- (package-read-all-archive-contents))
- (package-install package))
- t)
- (error
- (display-warning 'use-package
- (format "Failed to install %s: %s"
- name (error-message-string err))
- :error))))))))
-
-;;;###autoload
-(defun use-package-handler/:ensure (name _keyword ensure rest state)
- (let* ((body (use-package-process-keywords name rest state)))
- ;; We want to avoid installing packages when the `use-package' macro is
- ;; being macro-expanded by elisp completion (see `lisp--local-variables'),
- ;; but still install packages when byte-compiling, to avoid requiring
- ;; `package' at runtime.
- (if (bound-and-true-p byte-compile-current-file)
- ;; Eval when byte-compiling,
- (funcall use-package-ensure-function name ensure state)
- ;; or else wait until runtime.
- (push `(,use-package-ensure-function ',name ',ensure ',state)
- body))
- body))
-
-(add-to-list 'use-package-defaults
- '(:ensure (list use-package-always-ensure)
- (lambda (name args)
- (and use-package-always-ensure
- (not (plist-member args :load-path))))) t)
-
-(add-to-list 'use-package-defaults
- '(:pin use-package-always-pin use-package-always-pin) t)
-
-(add-to-list 'use-package-keywords :ensure)
-(add-to-list 'use-package-keywords :pin)
-
-(provide 'use-package-ensure)
-
-;;; use-package-ensure.el ends here
diff --git a/emacs.d/use-package/use-package-jump.el b/emacs.d/use-package/use-package-jump.el
deleted file mode 100644
index 0c4cd20..0000000
--- a/emacs.d/use-package/use-package-jump.el
+++ /dev/null
@@ -1,70 +0,0 @@
-;;; use-package-jump.el --- Attempt to jump to a use-package declaration -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
-
-;; Author: John Wiegley
-;; Maintainer: John Wiegley
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;; Provides the command `M-x use-package-jump-to-package-form', however it
-;; only works if the package being jumped to was required during
-;; initialization. If it was delay-loaded, it will not work.
-;; Improvements are needed.
-
-;;; Code:
-
-(require 'use-package-core)
-
-(defun use-package-find-require (package)
- "Find file that required PACKAGE by searching `load-history'.
-Returns an absolute file path or nil if none is found."
- (catch 'suspect
- (dolist (filespec load-history)
- (dolist (entry (cdr filespec))
- (when (equal entry (cons 'require package))
- (throw 'suspect (car filespec)))))))
-
-;;;###autoload
-(defun use-package-jump-to-package-form (package)
- "Attempt to find and jump to the `use-package' form that loaded PACKAGE.
-This will only find the form if that form actually required
-PACKAGE. If PACKAGE was previously required then this function
-will jump to the file that originally required PACKAGE instead."
- (interactive (list (completing-read "Package: " features)))
- (let* ((package (if (stringp package) (intern package) package))
- (requiring-file (use-package-find-require package))
- file location)
- (if (null requiring-file)
- (user-error "Can't find file requiring file; may have been autoloaded")
- (setq file (if (string= (file-name-extension requiring-file) "elc")
- (concat (file-name-sans-extension requiring-file) ".el")
- requiring-file))
- (when (file-exists-p file)
- (find-file-other-window file)
- (save-excursion
- (goto-char (point-min))
- (setq location
- (re-search-forward
- (format (eval use-package-form-regexp-eval) package) nil t)))
- (if (null location)
- (message "No use-package form found.")
- (goto-char location)
- (beginning-of-line))))))
-
-(provide 'use-package-jump)
-
-;;; use-package-jump.el ends here
diff --git a/emacs.d/use-package/use-package-lint.el b/emacs.d/use-package/use-package-lint.el
deleted file mode 100644
index 2092c0d..0000000
--- a/emacs.d/use-package/use-package-lint.el
+++ /dev/null
@@ -1,76 +0,0 @@
-;;; use-package-lint.el --- Attempt to find errors in use-package declarations -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
-
-;; Author: John Wiegley
-;; Maintainer: John Wiegley
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;; Provides the command `M-x use-package-lint'.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'use-package-core)
-
-(defun use-package-lint-declaration (name plist)
- (dolist (path (plist-get plist :load-path))
- (unless (file-exists-p path)
- (display-warning
- 'use-package
- (format "%s :load-path does not exist: %s"
- name path) :error)))
-
- (unless (or (plist-member plist :disabled)
- (plist-get plist :no-require)
- (locate-library (use-package-as-string name) nil
- (plist-get plist :load-path)))
- (display-warning
- 'use-package
- (format "%s module cannot be located" name) :error))
-
- ;; (dolist (command (plist-get plist :commands))
- ;; (unless (string= (find-lisp-object-file-name command nil)
- ;; (locate-library (use-package-as-string name) nil
- ;; (plist-get plist :load-path)))
- ;; (display-warning
- ;; 'use-package
- ;; (format "%s :command is from different path: %s"
- ;; name (symbol-name command)) :error)))
- )
-
-;;;###autoload
-(defun use-package-lint ()
- "Check for errors in `use-package' declarations.
-For example, if the module's `:if' condition is met, but even
-with the specified `:load-path' the module cannot be found."
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (let ((re (eval use-package-form-regexp-eval)))
- (while (re-search-forward re nil t)
- (goto-char (match-beginning 0))
- (let ((decl (read (current-buffer))))
- (when (eq (car decl) 'use-package)
- (use-package-lint-declaration
- (use-package-as-string (cadr decl))
- (use-package-normalize-keywords
- (cadr decl) (cddr decl)))))))))
-
-(provide 'use-package-lint)
-
-;;; use-package-lint.el ends here
diff --git a/emacs.d/use-package/use-package-tests.el b/emacs.d/use-package/use-package-tests.el
deleted file mode 100644
index ac3dce2..0000000
--- a/emacs.d/use-package/use-package-tests.el
+++ /dev/null
@@ -1,1988 +0,0 @@
-;;; use-package-tests.el --- Tests for use-package.el -*- lexical-binding: t; -*-
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'ert)
-(require 'use-package)
-
-(setq use-package-always-ensure nil
- use-package-verbose 'errors
- use-package-expand-minimally t
- ;; These are needed for certain tests below where the `pcase' match
- ;; expression is large and contains holes, such as the :after tests.
- max-lisp-eval-depth 8000
- max-specpdl-size 8000)
-
-(unless (fboundp 'macroexpand-1)
- (defun macroexpand-1 (form &optional environment)
- "Perform (at most) one step of macroexpansion."
- (cond
- ((consp form)
- (let* ((head (car form))
- (env-expander (assq head environment)))
- (if env-expander
- (if (cdr env-expander)
- (apply (cdr env-expander) (cdr form))
- form)
- (if (not (and (symbolp head) (fboundp head)))
- form
- (let ((def (autoload-do-load (symbol-function head) head 'macro)))
- (cond
- ;; Follow alias, but only for macros, otherwise we may end up
- ;; skipping an important compiler-macro (e.g. cl--block-wrapper).
- ((and (symbolp def) (macrop def)) (cons def (cdr form)))
- ((not (consp def)) form)
- (t
- (if (eq 'macro (car def))
- (apply (cdr def) (cdr form))
- form))))))))
- (t form))))
-
-(defmacro expand-minimally (form)
- `(let ((use-package-verbose 'errors)
- (use-package-expand-minimally t))
- (macroexpand-1 ',form)))
-
-(defmacro expand-maximally (form)
- `(let ((use-package-verbose 'debug)
- (use-package-expand-minimally nil))
- (macroexpand-1 ',form)))
-
-(defmacro match-expansion (form &rest value)
- `(should (pcase (expand-minimally ,form)
- ,@(mapcar #'(lambda (x) (list x t)) value))))
-
-(defun fix-expansion ()
- (interactive)
- (save-excursion
- (unless (looking-at "(match-expansion")
- (backward-up-list))
- (when (looking-at "(match-expansion")
- (re-search-forward "(\\(use-package\\|bind-key\\)")
- (goto-char (match-beginning 0))
- (let ((decl (read (current-buffer))))
- (kill-sexp)
- (let (vars)
- (catch 'exit
- (save-excursion
- (while (ignore-errors (backward-up-list) t)
- (when (looking-at "(let\\s-+")
- (goto-char (match-end 0))
- (setq vars (read (current-buffer)))
- (throw 'exit t)))))
- (eval
- `(let (,@ (append vars
- '((use-package-verbose 'errors)
- (use-package-expand-minimally t))))
- (insert ?\n ?\` (pp-to-string (macroexpand-1 decl))))))))))
-
-(bind-key "C-c C-u" #'fix-expansion emacs-lisp-mode-map)
-
-(ert-deftest use-package-test-recognize-function ()
- (should (use-package-recognize-function nil t))
- (should-not (use-package-recognize-function nil))
- (should (use-package-recognize-function t))
- (should (use-package-recognize-function 'sym))
- (should (use-package-recognize-function #'sym))
- (should (use-package-recognize-function (lambda () ...)))
- (should (use-package-recognize-function '(lambda () ...)))
- (should (use-package-recognize-function #'(lambda () ...)))
-
- (should-not (use-package-recognize-function 1))
- (should-not (use-package-recognize-function "Hello"))
- (should-not (use-package-recognize-function '(nil . nil))))
-
-(ert-deftest use-package-test-normalize-function ()
- (should (equal (use-package-normalize-function nil) nil))
- (should (equal (use-package-normalize-function t) t))
- (should (equal (use-package-normalize-function 'sym) 'sym))
- (should (equal (use-package-normalize-function #'sym) 'sym))
- (should (equal (use-package-normalize-function '(lambda () ...)) '(lambda () ...)))
- (should (equal (use-package-normalize-function ''(lambda () ...)) '(lambda () ...)))
- (should (equal (use-package-normalize-function '#'(lambda () ...)) '(lambda () ...)))
-
- (should (equal (use-package-normalize-function 1) 1))
- (should (equal (use-package-normalize-function "Hello") "Hello"))
- (should (equal (use-package-normalize-function '(nil . nil)) '(nil . nil))))
-
-(ert-deftest use-package-test/:disabled-1 ()
- (match-expansion
- (use-package foo :disabled t)
- `()))
-
-(ert-deftest use-package-test/:preface-1 ()
- (match-expansion
- (use-package foo :preface (t))
- `(progn
- (eval-and-compile
- (t))
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:preface-2 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :preface (t))
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors
- "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t))))
- (t))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:preface-3 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo
- :preface (preface)
- :init (init)
- :config (config)
- :functions func
- :defines def)
- `(progn
- (eval-and-compile
- (defvar def)
- (declare-function func "foo")
- (eval-when-compile
- (with-demoted-errors
- "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t))))
- (preface))
- (init)
- (require 'foo nil nil)
- (config)
- t))))
-
-(ert-deftest use-package-test/:preface-4 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo
- :preface (preface)
- :init (init)
- :config (config)
- :functions func
- :defines def
- :defer t)
- `(progn
- (eval-and-compile
- (defvar def)
- (declare-function func "foo")
- (eval-when-compile
- (with-demoted-errors
- "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t))))
- (preface))
- (init)
- (eval-after-load 'foo
- '(progn
- (config)
- t))))))
-
-(ert-deftest use-package-test/:pin-1 ()
- (match-expansion
- (use-package foo :pin foo)
- `(progn
- (use-package-pin-package 'foo "foo")
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:pin-2 ()
- (match-expansion
- (use-package foo :pin "foo")
- `(progn
- (use-package-pin-package 'foo "foo")
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test-normalize/:ensure ()
- (cl-flet ((norm (&rest args)
- (apply #'use-package-normalize/:ensure
- 'foopkg :ensure args)))
- (should (equal (norm '(t)) '(t)))
- (should (equal (norm '(nil)) '(nil)))
- (should (equal (norm '(sym)) '(sym)))
- (should-error (norm '(1)))
- (should-error (norm '("Hello")))))
-
-(ert-deftest use-package-test/:ensure-1 ()
- (let ((use-package-always-ensure nil))
- (match-expansion
- (use-package foo :ensure t)
- `(progn
- (use-package-ensure-elpa 'foo '(t) 'nil)
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-2 ()
- (let ((use-package-always-ensure t))
- (match-expansion
- (use-package foo :ensure t)
- `(progn
- (use-package-ensure-elpa 'foo '(t) 'nil)
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-3 ()
- (let ((use-package-always-ensure nil))
- (match-expansion
- (use-package foo :ensure nil)
- `(progn
- (use-package-ensure-elpa 'foo '(nil) 'nil)
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-4 ()
- (let ((use-package-always-ensure t))
- (match-expansion
- (use-package foo :ensure nil)
- `(progn
- (use-package-ensure-elpa 'foo '(nil) 'nil)
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-5 ()
- (let ((use-package-always-ensure nil))
- (match-expansion
- (use-package foo :load-path "foo")
- `(progn
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-6 ()
- (let ((use-package-always-ensure t))
- (match-expansion
- (use-package foo :load-path "foo")
- `(progn
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-7 ()
- (let ((use-package-always-ensure nil))
- (match-expansion
- (use-package foo :ensure nil :load-path "foo")
- `(progn
- (use-package-ensure-elpa 'foo '(nil) 'nil)
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-8 ()
- (let ((use-package-always-ensure t))
- (match-expansion
- (use-package foo :ensure nil :load-path "foo")
- `(progn
- (use-package-ensure-elpa 'foo '(nil) 'nil)
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-9 ()
- (let ((use-package-always-ensure nil))
- (match-expansion
- (use-package foo :ensure t :load-path "foo")
- `(progn
- (use-package-ensure-elpa 'foo '(t) 'nil)
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-10 ()
- (let ((use-package-always-ensure t))
- (match-expansion
- (use-package foo :ensure t :load-path "foo")
- `(progn
- (use-package-ensure-elpa 'foo '(t) 'nil)
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-11 ()
- (let (tried-to-install)
- (cl-letf (((symbol-function #'use-package-ensure-elpa)
- (lambda (name ensure state &optional no-refresh)
- (when ensure
- (setq tried-to-install name))))
- ((symbol-function #'require) #'ignore))
- (use-package foo :ensure t)
- (should (eq tried-to-install 'foo)))))
-
-(ert-deftest use-package-test/:ensure-12 ()
- (let ((use-package-always-ensure t))
- (match-expansion
- (use-package foo :ensure bar)
- `(progn
- (use-package-ensure-elpa 'foo '(bar) 'nil)
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-13 ()
- (let ((use-package-always-ensure t))
- (match-expansion
- (use-package foo :ensure bar :ensure quux)
- `(progn
- (use-package-ensure-elpa 'foo '(bar quux) 'nil)
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:ensure-14 ()
- (match-expansion
- (use-package ess-site
- :ensure ess1
- :ensure ess2
- :ensure (ess3 :pin "melpa-unstable")
- :pin melpa-stable)
- `(progn
- (use-package-pin-package 'ess-site "melpa-stable")
- (use-package-ensure-elpa 'ess-site
- '(ess1 ess2
- (ess3 . "melpa-unstable"))
- 'nil)
- (require 'ess-site nil nil))))
-
-(ert-deftest use-package-test/:ensure-15 ()
- (let ((use-package-always-ensure t))
- (match-expansion
- (use-package foo
- :pin "elpa"
- :ensure bar
- :ensure (quux :pin "melpa"))
- `(progn
- (use-package-pin-package 'foo "elpa")
- (use-package-ensure-elpa 'foo
- '(bar
- (quux . "melpa"))
- 'nil)
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:if-1 ()
- (match-expansion
- (use-package foo :if t)
- `(when t
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:if-2 ()
- (match-expansion
- (use-package foo :if (and t t))
- `(when (and t t)
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:if-3 ()
- (match-expansion
- (use-package foo :if nil)
- `(when nil
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:when-1 ()
- (match-expansion
- (use-package foo :when t)
- `(when t
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:when-2 ()
- (match-expansion
- (use-package foo :when (and t t))
- `(when (and t t)
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:when-3 ()
- (match-expansion
- (use-package foo :when nil)
- `(when nil
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:unless-1 ()
- (match-expansion
- (use-package foo :unless t)
- `(when (not t)
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:unless-2 ()
- (match-expansion
- (use-package foo :unless (and t t))
- `(when (not (and t t))
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:unless-3 ()
- (match-expansion
- (use-package foo :unless nil)
- `(unless nil
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:requires-1 ()
- (match-expansion
- (use-package foo :requires bar)
- `(when (featurep 'bar)
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:requires-2 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :requires bar)
- `(when (featurep 'bar)
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors
- "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:requires-3 ()
- (match-expansion
- (use-package foo :requires (bar quux))
- `(when (not (member nil (mapcar #'featurep '(bar quux))))
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:requires-4 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :requires bar)
- `(when (featurep 'bar)
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:load-path-1 ()
- (match-expansion
- (use-package foo :load-path "bar")
- `(progn
- (eval-and-compile
- (add-to-list 'load-path
- ,(pred (apply-partially
- #'string=
- (expand-file-name
- "bar" user-emacs-directory)))))
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:load-path-2 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :load-path "bar")
- `(progn
- (eval-and-compile
- (add-to-list 'load-path
- ,(pred (apply-partially
- #'string=
- (expand-file-name
- "bar" user-emacs-directory)))))
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:load-path-3 ()
- (match-expansion
- (use-package foo :load-path ("bar" "quux"))
- `(progn
- (eval-and-compile
- (add-to-list 'load-path
- ,(pred (apply-partially
- #'string=
- (expand-file-name
- "bar" user-emacs-directory)))))
- (eval-and-compile
- (add-to-list 'load-path
- ,(pred (apply-partially
- #'string=
- (expand-file-name
- "quux" user-emacs-directory)))))
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:load-path-4 ()
- (match-expansion
- (use-package foo :load-path (lambda () (list "bar" "quux")))
- `(progn
- (eval-and-compile
- (add-to-list 'load-path
- ,(pred (apply-partially
- #'string=
- (expand-file-name
- "bar" user-emacs-directory)))))
- (eval-and-compile
- (add-to-list 'load-path
- ,(pred (apply-partially
- #'string=
- (expand-file-name
- "quux" user-emacs-directory)))))
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:no-require-1 ()
- (match-expansion
- (use-package foo :no-require t)
- `nil))
-
-(ert-deftest use-package-test/:no-require-2 ()
- (match-expansion
- (use-package foo :no-require t :config (config))
- `(progn
- (config)
- t)))
-
-(ert-deftest use-package-test/:no-require-3 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :no-require t)
- `(eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil nil))))))
-
-(defun use-package-test-normalize-bind (&rest args)
- (apply #'use-package-normalize-binder 'foo :bind args))
-
-(ert-deftest use-package-test-normalize/:bind-1 ()
- (should (equal (use-package-test-normalize-bind
- '(("C-a" . alpha)))
- '(("C-a" . alpha)))))
-
-(ert-deftest use-package-test-normalize/:bind-2 ()
- (should (equal (use-package-test-normalize-bind
- '(("C-a" . alpha)
- :map foo-map
- ("C-b" . beta)))
- '(("C-a" . alpha)
- :map foo-map
- ("C-b" . beta)))))
-
-(ert-deftest use-package-test-normalize/:bind-3 ()
- (should (equal (use-package-test-normalize-bind
- '(:map foo-map
- ("C-a" . alpha)
- ("C-b" . beta)))
- '(:map foo-map
- ("C-a" . alpha)
- ("C-b" . beta)))))
-
-(ert-deftest use-package-test/:bind-1 ()
- (match-expansion
- (use-package foo :bind ("C-k" . key1) ("C-u" . key2))
- `(progn
- (unless
- (fboundp 'key1)
- (autoload #'key1 "foo" nil t))
- (unless
- (fboundp 'key2)
- (autoload #'key2 "foo" nil t))
- (bind-keys :package foo
- ("C-k" . key1)
- ("C-u" . key2)))))
-
-(ert-deftest use-package-test/:bind-2 ()
- (match-expansion
- (use-package foo :bind (("C-k" . key1) ("C-u" . key2)))
- `(progn
- (unless (fboundp 'key1)
- (autoload #'key1 "foo" nil t))
- (unless (fboundp 'key2)
- (autoload #'key2 "foo" nil t))
- (bind-keys :package foo
- ("C-k" . key1)
- ("C-u" . key2)))))
-
-(ert-deftest use-package-test/:bind-3 ()
- (match-expansion
- (use-package foo :bind (:map my-map ("C-k" . key1) ("C-u" . key2)))
- `(progn
- (unless
- (fboundp 'key1)
- (autoload #'key1 "foo" nil t))
- (unless
- (fboundp 'key2)
- (autoload #'key2 "foo" nil t))
- (bind-keys :package foo :map my-map
- ("C-k" . key1)
- ("C-u" . key2)))))
-
-(ert-deftest use-package-test/:bind-4 ()
- (should-error
- (match-expansion
- (use-package foo :bind :map my-map ("C-k" . key1) ("C-u" . key2))
- `(bind-keys :package foo))))
-
-(ert-deftest use-package-test/:bind-5 ()
- (match-expansion
- (use-package foo :bind ("C-k" . key1) (:map my-map ("C-u" . key2)))
- `(progn
- (unless (fboundp 'key1)
- (autoload #'key1 "foo" nil t))
- (unless (fboundp 'key2)
- (autoload #'key2 "foo" nil t))
- (bind-keys :package foo
- ("C-k" . key1)
- :map my-map
- ("C-u" . key2)))))
-
-(ert-deftest use-package-test/:bind-6 ()
- (match-expansion
- (use-package foo
- :bind
- ("C-k" . key1)
- (:map my-map ("C-u" . key2))
- (:map my-map2 ("C-u" . key3)))
- `(progn
- (unless (fboundp 'key1)
- (autoload #'key1 "foo" nil t))
- (unless (fboundp 'key2)
- (autoload #'key2 "foo" nil t))
- (unless (fboundp 'key3)
- (autoload #'key3 "foo" nil t))
- (bind-keys :package foo
- ("C-k" . key1)
- :map my-map ("C-u" . key2)
- :map my-map2 ("C-u" . key3)))))
-
-(ert-deftest use-package-test/:bind-7 ()
- (match-expansion
- (use-package foo
- :ensure
- :bind ("C-c r" . browse-at-remote))
- `(progn
- (use-package-ensure-elpa 'foo '(t) 'nil)
- (unless (fboundp 'browse-at-remote)
- (autoload #'browse-at-remote "foo" nil t))
- (bind-keys :package foo ("C-c r" . browse-at-remote)))))
-
-(ert-deftest use-package-test/:bind-8 ()
- (match-expansion
- (use-package foo
- :ensure
- :bind (:map foo-map
- (("C-c r" . foo)
- ("C-c r" . bar))))
- `(progn
- (use-package-ensure-elpa 'foo '(t) 'nil)
- (unless (fboundp 'foo)
- (autoload #'foo "foo" nil t))
- (unless (fboundp 'bar)
- (autoload #'bar "foo" nil t))
- (bind-keys :package foo :map foo-map
- ("C-c r" . foo)
- ("C-c r" . bar)))))
-
-(ert-deftest use-package-test/:bind*-1 ()
- (match-expansion
- (use-package foo :bind* ("C-k" . key))
- `(progn
- (unless (fboundp 'key)
- (autoload #'key "foo" nil t))
- (bind-keys* :package foo ("C-k" . key)))))
-
-(ert-deftest use-package-test/:bind-keymap-1 ()
- (match-expansion
- (use-package foo :bind-keymap ("C-k" . key))
- `(bind-key "C-k"
- #'(lambda nil
- (interactive)
- (use-package-autoload-keymap 'key 'foo nil)))))
-
-(ert-deftest use-package-test/:bind-keymap*-1 ()
- (match-expansion
- (use-package foo :bind-keymap* ("C-k" . key))
- `(bind-key* "C-k"
- #'(lambda ()
- (interactive)
- (use-package-autoload-keymap 'key 'foo t)))))
-
-(ert-deftest use-package-test/:interpreter-1 ()
- (match-expansion
- (use-package foo :interpreter "interp")
- `(progn
- (unless (fboundp 'foo)
- (autoload #'foo "foo" nil t))
- (add-to-list 'interpreter-mode-alist '("interp" . foo)))))
-
-(ert-deftest use-package-test/:interpreter-2 ()
- (match-expansion
- (use-package foo :interpreter ("interp" . fun))
- `(progn
- (unless (fboundp 'fun)
- (autoload #'fun "foo" nil t))
- (add-to-list 'interpreter-mode-alist '("interp" . fun)))))
-
-(ert-deftest use-package-test-normalize/:mode ()
- (cl-flet ((norm (&rest args)
- (apply #'use-package-normalize/:mode
- 'foopkg :mode args)))
- (should (equal (norm '(".foo"))
- '((".foo" . foopkg))))
- (should (equal (norm '(".foo" ".bar"))
- '((".foo" . foopkg) (".bar" . foopkg))))
- (should (equal (norm '((".foo" ".bar")))
- '((".foo" . foopkg) (".bar" . foopkg))))
- (should (equal (norm '((".foo")))
- '((".foo" . foopkg))))
- (should (equal (norm '((".foo" . foo) (".bar" . bar)))
- '((".foo" . foo) (".bar" . bar))))))
-
-(ert-deftest use-package-test/:mode-1 ()
- (match-expansion
- (use-package foo :mode "interp")
- `(progn
- (unless (fboundp 'foo)
- (autoload #'foo "foo" nil t))
- (add-to-list 'auto-mode-alist '("interp" . foo)))))
-
-(ert-deftest use-package-test/:mode-2 ()
- (match-expansion
- (use-package foo :mode ("interp" . fun))
- `(progn
- (unless (fboundp 'fun)
- (autoload #'fun "foo" nil t))
- (add-to-list 'auto-mode-alist '("interp" . fun)))))
-
-(ert-deftest use-package-test/:magic-1 ()
- (match-expansion
- (use-package foo :magic "interp")
- `(progn
- (unless (fboundp 'foo)
- (autoload #'foo "foo" nil t))
- (add-to-list 'magic-mode-alist '("interp" . foo)))))
-
-(ert-deftest use-package-test/:magic-2 ()
- (match-expansion
- (use-package foo :magic ("interp" . fun))
- `(progn
- (unless (fboundp 'fun)
- (autoload #'fun "foo" nil t))
- (add-to-list 'magic-mode-alist '("interp" . fun)))))
-
-(ert-deftest use-package-test/:magic-fallback-1 ()
- (match-expansion
- (use-package foo :magic-fallback "interp")
- `(progn
- (unless (fboundp 'foo)
- (autoload #'foo "foo" nil t))
- (add-to-list 'magic-fallback-mode-alist '("interp" . foo)))))
-
-(ert-deftest use-package-test/:magic-fallback-2 ()
- (match-expansion
- (use-package foo :magic-fallback ("interp" . fun))
- `(progn
- (unless (fboundp 'fun)
- (autoload #'fun "foo" nil t))
- (add-to-list 'magic-fallback-mode-alist '("interp" . fun)))))
-
-(ert-deftest use-package-test/:commands-1 ()
- (match-expansion
- (use-package foo :commands bar)
- `(unless (fboundp 'bar)
- (autoload #'bar "foo" nil t))))
-
-(ert-deftest use-package-test/:commands-2 ()
- (match-expansion
- (use-package foo :commands (bar quux))
- `(progn
- (unless (fboundp 'bar)
- (autoload #'bar "foo" nil t))
- (unless (fboundp 'quux)
- (autoload #'quux "foo" nil t)))))
-
-(ert-deftest use-package-test/:commands-3 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :commands (bar quux))
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (unless (fboundp 'bar)
- (autoload #'bar "foo" nil t))
- (eval-when-compile
- (declare-function bar "foo"))
- (unless (fboundp 'quux)
- (autoload #'quux "foo" nil t))
- (eval-when-compile
- (declare-function quux "foo"))))))
-
-(ert-deftest use-package-test/:commands-4 ()
- (match-expansion
- (use-package foo :commands bar :init (bar))
- `(progn
- (unless
- (fboundp 'bar)
- (autoload #'bar "foo" nil t))
- (bar))))
-
-(ert-deftest use-package-test/:commands-5 ()
- (match-expansion
- (use-package gnus-harvest
- :load-path "foo"
- :commands gnus-harvest-install
- :demand t
- :config
- (if (featurep 'message-x)
- (gnus-harvest-install 'message-x)
- (gnus-harvest-install)))
- `(progn
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (require 'gnus-harvest nil nil)
- (if (featurep 'message-x)
- (gnus-harvest-install 'message-x)
- (gnus-harvest-install))
- t)))
-
-(ert-deftest use-package-test/:commands-6 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package gnus-harvest
- :load-path "foo"
- :commands gnus-harvest-install
- :demand t
- :config
- (if (featurep 'message-x)
- (gnus-harvest-install 'message-x)
- (gnus-harvest-install)))
- `(progn
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load gnus-harvest: %S" nil
- (unless (featurep 'gnus-harvest)
- (load "gnus-harvest" nil t)))))
- (eval-when-compile
- (declare-function gnus-harvest-install "gnus-harvest"))
- (require 'gnus-harvest nil nil)
- (if
- (featurep 'message-x)
- (gnus-harvest-install 'message-x)
- (gnus-harvest-install))
- t))))
-
-(ert-deftest use-package-test/:autoload-1 ()
- (match-expansion
- (use-package foo :autoload bar)
- `(unless (fboundp 'bar)
- (autoload #'bar "foo"))))
-
-(ert-deftest use-package-test/:defines-1 ()
- (match-expansion
- (use-package foo :defines bar)
- `(require 'foo nil nil)))
-
-(ert-deftest use-package-test/:defines-2 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :defines bar)
- `(progn
- (eval-and-compile
- (defvar bar)
- (eval-when-compile
- (with-demoted-errors
- "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:functions-1 ()
- (match-expansion
- (use-package foo :functions bar)
- `(require 'foo nil nil)))
-
-(ert-deftest use-package-test/:functions-2 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :functions bar)
- `(progn
- (eval-and-compile
- (declare-function bar "foo")
- (eval-when-compile
- (with-demoted-errors
- "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:functions-3 ()
- (match-expansion
- (use-package foo :defer t :functions bar)
- `nil))
-
-(ert-deftest use-package-test/:functions-4 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :defer t :functions bar)
- `(eval-and-compile
- (declare-function bar "foo")
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t))))))))
-
-(ert-deftest use-package-test/:functions-5 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :defer t :config (config) :functions bar)
- `(progn
- (eval-and-compile
- (declare-function bar "foo")
- (eval-when-compile
- (with-demoted-errors
- "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (eval-after-load 'foo
- '(progn
- (config)
- t))))))
-
-(ert-deftest use-package-test/:defer-1 ()
- (match-expansion
- (use-package foo)
- `(require 'foo nil nil)))
-
-(ert-deftest use-package-test/:defer-2 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo)
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:defer-3 ()
- (match-expansion
- (use-package foo :defer t)
- `nil))
-
-(ert-deftest use-package-test/:defer-4 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :defer t)
- `(eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t))))))))
-
-(ert-deftest use-package-test-normalize/:hook ()
- (cl-flet ((norm (&rest args)
- (apply #'use-package-normalize/:hook
- 'foopkg :hook args)))
- (should-error (norm nil))
- (should (equal (norm '(bar))
- '((bar . foopkg-mode))))
- (should (equal (norm '((bar . foopkg)))
- '((bar . foopkg))))
- (should (equal (norm '((bar . baz)))
- '((bar . baz))))
- (should (equal (norm '(((bar baz) . quux)))
- '(((bar baz) . quux))))
- (should (equal (norm '(bar baz))
- '(((bar baz) . foopkg-mode))))
- (should (equal (norm '((bar baz) (quux bow)))
- '(((bar baz) . foopkg-mode) ((quux bow) . foopkg-mode))))
- (should (equal (norm '((bar . baz) (quux . bow)))
- '((bar . baz) (quux . bow))))
- (should (equal (norm '(((bar1 bar2) . baz) ((quux1 quux2) . bow)))
- '(((bar1 bar2) . baz) ((quux1 quux2) . bow))))))
-
-(ert-deftest use-package-test/:hook-1 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo
- :bind (("C-a" . key))
- :hook (hook . fun))
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors
- "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (unless
- (fboundp 'key)
- (autoload #'key "foo" nil t))
- (eval-when-compile
- (declare-function key "foo"))
- (unless
- (fboundp 'fun)
- (autoload #'fun "foo" nil t))
- (eval-when-compile
- (declare-function fun "foo"))
- (add-hook 'hook-hook #'fun)
- (bind-keys :package foo ("C-a" . key))))))
-
-(ert-deftest use-package-test/:hook-2 ()
- (match-expansion
- (use-package foo
- :hook (hook . fun))
- `(progn
- (unless (fboundp 'fun)
- (autoload #'fun "foo" nil t))
- (add-hook 'hook-hook #'fun))))
-
-(ert-deftest use-package-test/:hook-3 ()
- (let ((use-package-hook-name-suffix nil))
- (match-expansion
- (use-package foo
- :hook (hook . fun))
- `(progn
- (unless (fboundp 'fun)
- (autoload #'fun "foo" nil t))
- (add-hook 'hook #'fun)))))
-
-(ert-deftest use-package-test/:hook-4 ()
- (let ((use-package-hook-name-suffix "-special"))
- (match-expansion
- (use-package foo
- :hook (hook . fun))
- `(progn
- (unless (fboundp 'fun)
- (autoload #'fun "foo" nil t))
- (add-hook 'hook-special #'fun)))))
-
-(ert-deftest use-package-test/:hook-5 ()
- (match-expansion
- (use-package erefactor
- :load-path "foo"
- :after elisp-mode
- :load t
- :hook (emacs-lisp-mode
- . (lambda ()
- (bind-key "\C-c\C-v" erefactor-map emacs-lisp-mode-map))))
- `(progn
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (eval-after-load 'elisp-mode
- '(progn
- (require 'erefactor nil nil)
- (add-hook
- 'emacs-lisp-mode-hook
- #'(lambda nil
- (bind-key "" erefactor-map emacs-lisp-mode-map))))))))
-
-(ert-deftest use-package-test/:hook-6 ()
- (match-expansion
- (use-package erefactor
- :load-path "foo"
- :after elisp-mode
- :hook (emacs-lisp-mode . function))
- `(progn
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (eval-after-load 'elisp-mode
- '(progn
- (unless (fboundp 'function)
- (autoload #'function "erefactor" nil t))
- (add-hook 'emacs-lisp-mode-hook #'function))))))
-
-(ert-deftest use-package-test/:hook-7 ()
- (match-expansion
- (use-package erefactor
- :load-path "foo"
- :after elisp-mode
- :hook (emacs-lisp-mode . (lambda () (function))))
- `(progn
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (eval-after-load 'elisp-mode
- '(progn
- (require 'erefactor nil nil)
- (add-hook 'emacs-lisp-mode-hook #'(lambda nil (function))))))))
-
-(ert-deftest use-package-test-normalize/:custom ()
- (cl-flet ((norm (&rest args)
- (apply #'use-package-normalize/:custom
- 'foopkg :custom args)))
- (should-error (norm nil))
- (should-error (norm '(bar)))
- ;; (should-error (norm '((foo bar baz quux))))
- (should (equal (norm '(foo bar)) '((foo bar))))
- ;; (should-error (norm '(foo bar baz)))
- ;; (should (equal (norm '(foo bar "baz"))
- ;; '((foo bar baz))))
- ))
-
-
-(ert-deftest use-package-test/:custom-1 ()
- (match-expansion
- (use-package foo :custom (foo bar))
- `(progn
- (let
- ((custom--inhibit-theme-enable nil))
- (unless (memq 'use-package custom-known-themes)
- (deftheme use-package)
- (enable-theme 'use-package)
- (setq custom-enabled-themes (remq 'use-package custom-enabled-themes)))
- (custom-theme-set-variables 'use-package
- '(foo bar nil nil "Customized with use-package foo")))
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:custom-with-comment1 ()
- (match-expansion
- (use-package foo :custom (foo bar "commented"))
- `(progn
- (let
- ((custom--inhibit-theme-enable nil))
- (unless (memq 'use-package custom-known-themes)
- (deftheme use-package)
- (enable-theme 'use-package)
- (setq custom-enabled-themes (remq 'use-package custom-enabled-themes)))
- (custom-theme-set-variables 'use-package
- '(foo bar nil nil "commented")))
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:custom-face-1 ()
- (match-expansion
- (use-package foo :custom-face (foo ((t (:background "#e4edfc")))))
- `(progn
- (apply #'face-spec-set (backquote (foo ((t (:background "#e4edfc"))))))
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:custom-face-2 ()
- (match-expansion
- (use-package example
- :custom-face
- (example-1-face ((t (:foreground "LightPink"))))
- (example-2-face ((t (:foreground "LightGreen")))))
- `(progn
- (apply #'face-spec-set
- (backquote (example-1-face ((t (:foreground "LightPink"))))))
- (apply #'face-spec-set
- (backquote (example-2-face ((t (:foreground "LightGreen"))))))
- (require 'example nil nil))))
-
-(ert-deftest use-package-test/:custom-face-3 ()
- (match-expansion
- (use-package foo :custom-face (foo ((t (:background "#e4edfc"))) face-defspec-spec))
- `(progn
- (apply #'face-spec-set (backquote (foo ((t (:background "#e4edfc"))) face-defspec-spec)))
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:init-1 ()
- (match-expansion
- (use-package foo :init (init))
- `(progn
- (init)
- (require 'foo nil nil))))
-
-(ert-deftest use-package-test/:init-2 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :init (init))
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (init)
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:catch-1 ()
- (match-expansion
- (use-package foo :catch t)
- `(progn
- (defvar ,_
- #'(lambda (keyword err)
- (let ((msg (format "%s/%s: %s" 'foo keyword
- (error-message-string err))))
- (display-warning 'use-package msg :error))))
- (condition-case-unless-debug err
- (require 'foo nil nil)
- (error
- (funcall ,_ :catch err))))))
-
-(ert-deftest use-package-test/:catch-2 ()
- (match-expansion
- (use-package foo :catch nil)
- `(require 'foo nil nil)))
-
-(ert-deftest use-package-test/:catch-3 ()
- (match-expansion
- (use-package foo :catch (lambda (keyword error)))
- `(progn
- (defvar ,_ (lambda (keyword error)))
- (condition-case-unless-debug err
- (require 'foo nil nil)
- (error
- (funcall ,_ :catch err))))))
-
-(ert-deftest use-package-test/:after-1 ()
- (match-expansion
- (use-package foo :after bar)
- `(eval-after-load 'bar
- '(require 'foo nil nil))))
-
-(ert-deftest use-package-test/:after-2 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :after bar)
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (eval-after-load 'bar
- '(require 'foo nil nil))))))
-
-(ert-deftest use-package-test/:after-3 ()
- (match-expansion
- (use-package foo :after (bar quux))
- `(eval-after-load 'quux
- '(eval-after-load 'bar
- '(require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:after-4 ()
- (match-expansion
- (use-package foo :after (:all bar quux))
- `(eval-after-load 'quux
- '(eval-after-load 'bar
- '(require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:after-5 ()
- (match-expansion
- (use-package foo :after (:any bar quux))
- `(progn
- (defvar ,_ nil)
- (defvar ,_ nil)
- (defvar ,_
- #'(lambda nil
- (if ,_ ,_
- (setq ,_ t ,_
- (require 'foo nil nil)))))
- (eval-after-load 'bar
- '(funcall ,_))
- (eval-after-load 'quux
- '(funcall ,_)))))
-
-(ert-deftest use-package-test/:after-6 ()
- (match-expansion
- (use-package foo :after (:all (:any bar quux) bow))
- `(progn
- (defvar ,_ nil)
- (defvar ,_ nil)
- (defvar ,_
- #'(lambda nil
- (if ,_ ,_
- (setq ,_ t ,_
- (require 'foo nil nil)))))
- (eval-after-load 'bow
- '(progn
- (eval-after-load 'bar
- '(funcall ,_))
- (eval-after-load 'quux
- '(funcall ,_)))))))
-
-(ert-deftest use-package-test/:after-7 ()
- (match-expansion
- (use-package foo :after (:any (:all bar quux) bow))
- `(progn
- (defvar ,_ nil)
- (defvar ,_ nil)
- (defvar ,_
- #'(lambda nil
- (if ,_ ,_
- (setq ,_ t ,_
- (require 'foo nil nil)))))
- (eval-after-load 'quux
- '(eval-after-load 'bar
- '(funcall ,_)))
- (eval-after-load 'bow
- '(funcall ,_)))))
-
-(ert-deftest use-package-test/:after-8 ()
- (match-expansion
- (use-package foo :after (:all (:any bar quux) (:any bow baz)))
- `(progn
- (defvar ,_ nil)
- (defvar ,_ nil)
- (defvar ,_
- #'(lambda nil
- (if ,_ ,_
- (setq ,_ t ,_
- (require 'foo nil nil)))))
- (eval-after-load 'bow
- '(progn
- (eval-after-load 'bar
- '(funcall ,_))
- (eval-after-load 'quux
- '(funcall ,_))))
- (eval-after-load 'baz
- '(progn
- (eval-after-load 'bar
- '(funcall ,_))
- (eval-after-load 'quux
- '(funcall ,_)))))))
-
-(ert-deftest use-package-test/:after-9 ()
- (match-expansion
- (use-package foo :after (:any (:all bar quux) (:all bow baz)))
- `(progn
- (defvar ,_ nil)
- (defvar ,_ nil)
- (defvar ,_
- #'(lambda nil
- (if ,_ ,_
- (setq ,_ t ,_
- (require 'foo nil nil)))))
- (eval-after-load 'quux
- '(eval-after-load 'bar
- '(funcall ,_)))
- (eval-after-load 'baz
- '(eval-after-load 'bow
- '(funcall ,_))))))
-
-(ert-deftest use-package-test/:after-10 ()
- (match-expansion
- (use-package foo :after (:any (:all bar quux) (:any bow baz)))
- `(progn
- (defvar ,_ nil)
- (defvar ,_ nil)
- (defvar ,_
- #'(lambda nil
- (if ,_ ,_
- (setq ,_ t ,_
- (require 'foo nil nil)))))
- (eval-after-load 'quux
- '(eval-after-load 'bar
- '(funcall ,_)))
- (eval-after-load 'bow
- '(funcall ,_))
- (eval-after-load 'baz
- '(funcall ,_)))))
-
-(ert-deftest use-package-test/:demand-1 ()
- (match-expansion
- (use-package foo :demand t)
- `(require 'foo nil nil)))
-
-(ert-deftest use-package-test/:demand-2 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :demand t)
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (require 'foo nil nil)))))
-
-(ert-deftest use-package-test/:demand-3 ()
- (match-expansion
- (use-package foo :demand t :config (config))
- `(progn
- (require 'foo nil nil)
- (config)
- t)))
-
-(ert-deftest use-package-test/:demand-4 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :demand t :config (config))
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (require 'foo nil nil)
- (config)
- t))))
-
-(ert-deftest use-package-test/:demand-5 ()
- ;; #529 - :demand should not override an explicit use of :after
- (match-expansion
- (use-package foo :demand t :after bar)
- `(eval-after-load 'bar
- '(require 'foo nil nil))))
-
-(ert-deftest use-package-test/:demand-6 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :demand t :after bar)
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (eval-after-load 'bar
- '(require 'foo nil nil))))))
-
-(ert-deftest use-package-test/:demand-7 ()
- (match-expansion
- (use-package counsel
- :load-path "foo"
- :after ivy
- :demand t
- :diminish
- :bind (("C-*" . counsel-org-agenda-headlines)
- ("M-x" . counsel-M-x))
- :commands (counsel-minibuffer-history
- counsel-find-library
- counsel-unicode-char)
- :preface (preface-code)
- :init
- ;; This is actually wrong, but it's just part of the example.
- (define-key minibuffer-local-map (kbd "M-r")
- 'counsel-minibuffer-history))
- `(progn
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (eval-and-compile
- (preface-code))
- (eval-after-load 'ivy
- '(progn
- (define-key minibuffer-local-map (kbd "M-r")
- 'counsel-minibuffer-history)
- (require 'counsel nil nil)
- (if (fboundp 'diminish)
- (diminish 'counsel-mode))
- (bind-keys :package counsel
- ("C-*" . counsel-org-agenda-headlines)
- ("M-x" . counsel-M-x)))))))
-
-(ert-deftest use-package-test/:config-1 ()
- (match-expansion
- (use-package foo :config (config))
- `(progn
- (require 'foo nil nil)
- (config)
- t)))
-
-(ert-deftest use-package-test/:config-2 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :config (config))
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (require 'foo nil nil)
- (config)
- t))))
-
-(ert-deftest use-package-test/:config-3 ()
- (match-expansion
- (use-package foo :defer t :config (config))
- `(eval-after-load 'foo
- '(progn
- (config)
- t))))
-
-(ert-deftest use-package-test/:config-4 ()
- (let ((byte-compile-current-file t))
- (match-expansion
- (use-package foo :defer t :config (config))
- `(progn
- (eval-and-compile
- (eval-when-compile
- (with-demoted-errors "Cannot load foo: %S" nil
- (unless (featurep 'foo)
- (load "foo" nil t)))))
- (eval-after-load 'foo
- '(progn
- (config)
- t))))))
-
-(ert-deftest use-package-test/pre-post-hooks-with-:config ()
- (let ((use-package-inject-hooks t))
- (match-expansion
- (use-package foo :config (config))
- `(progn
- (when
- (run-hook-with-args-until-failure 'use-package--foo--pre-init-hook)
- (run-hooks 'use-package--foo--post-init-hook))
- (require 'foo nil nil)
- (when
- (run-hook-with-args-until-failure 'use-package--foo--pre-config-hook)
- (config)
- (run-hooks 'use-package--foo--post-config-hook))
- t))))
-
-(ert-deftest use-package-test/pre-post-hooks-without-:config ()
- ;; https://github.com/jwiegley/use-package/issues/785
- (let ((use-package-inject-hooks t))
- (match-expansion
- (use-package foo)
- `(progn
- (when
- (run-hook-with-args-until-failure 'use-package--foo--pre-init-hook)
- (run-hooks 'use-package--foo--post-init-hook))
- (require 'foo nil nil)
- (when
- (run-hook-with-args-until-failure 'use-package--foo--pre-config-hook)
- t
- (run-hooks 'use-package--foo--post-config-hook))
- t))))
-
-(ert-deftest use-package-test-normalize/:diminish ()
- (should (equal (use-package-normalize-diminish 'foopkg :diminish nil)
- '(foopkg-mode)))
- (should (equal (use-package-normalize-diminish 'foopkg :diminish 'bar)
- '(bar)))
- (should (equal (use-package-normalize-diminish 'foopkg :diminish "bar")
- '((foopkg-mode . "bar"))))
- (should (equal (use-package-normalize-diminish 'foopkg :diminish 'foo-mode)
- '(foo-mode)))
- (should (equal (use-package-normalize-diminish 'foopkg :diminish '(foo . "bar"))
- '((foo . "bar")))))
-
-(ert-deftest use-package-test/:diminish-1 ()
- (match-expansion
- (use-package foo :diminish nil)
- `(progn
- (require 'foo nil nil)
- (if (fboundp 'diminish)
- (diminish 'foo-mode)))))
-
-(ert-deftest use-package-test/:diminish-2 ()
- (match-expansion
- (use-package foo :diminish bar)
- `(progn
- (require 'foo nil nil)
- (if (fboundp 'diminish)
- (diminish 'bar)))))
-
-(ert-deftest use-package-test/:diminish-3 ()
- (match-expansion
- (use-package foo :diminish "bar")
- `(progn
- (require 'foo nil nil)
- (if (fboundp 'diminish)
- (diminish 'foo-mode "bar")))))
-
-(ert-deftest use-package-test/:diminish-4 ()
- (match-expansion
- (use-package foo :diminish (foo . "bar"))
- `(progn
- (require 'foo nil nil)
- (if (fboundp 'diminish)
- (diminish 'foo "bar")))))
-
-(ert-deftest use-package-test-normalize/:delight ()
- (should (equal `((foo-mode nil foo))
- (use-package-normalize/:delight 'foo :delight nil)))
- (should (equal `((foo-mode nil foo-mode))
- (use-package-normalize/:delight 'foo-mode :delight nil)))
- (should (equal `((bar-mode nil foo))
- (use-package-normalize/:delight 'foo :delight '(bar-mode))))
- (should (equal `((bar-mode nil :major))
- (use-package-normalize/:delight 'foo :delight '((bar-mode nil :major)))))
- (should (equal `((foo-mode "abc" foo))
- (use-package-normalize/:delight 'foo :delight '("abc"))))
- (should (equal `((foo-mode (:eval 1) foo))
- (use-package-normalize/:delight 'foo :delight '('(:eval 1)))))
- (should (equal (use-package-normalize/:delight 'foo :delight '((a-mode) (b-mode " b")))
- `((a-mode nil foo) (b-mode " b" foo))))
- (should-error (use-package-normalize/:delight 'foo :delight '((:eval 1)))))
-
-(ert-deftest use-package-test/:delight-1 ()
- (match-expansion
- (use-package foo :delight)
- `(progn
- (require 'foo nil nil)
- (if (fboundp 'delight)
- (delight '((foo-mode nil foo)))))))
-
-(ert-deftest use-package-test/:delight-2 ()
- (should-error
- (match-expansion
- (use-package foo :delight nil)
- `(progn
- (require 'foo nil nil)
- (if (fboundp 'diminish)
- (diminish 'foo-mode))))))
-
-(ert-deftest use-package-test/:delight-3 ()
- (match-expansion
- (use-package foo :delight bar)
- `(progn
- (require 'foo nil nil)
- (if (fboundp 'delight)
- (delight '((bar nil foo)))))))
-
-(ert-deftest use-package-test/:delight-4 ()
- (match-expansion
- (use-package foo :delight "bar")
- `(progn
- (require 'foo nil nil)
- (if (fboundp 'delight)
- (delight '((foo-mode "bar" foo)))))))
-
-(ert-deftest use-package-test/:delight-5 ()
- (should-error
- (match-expansion
- (use-package foo :delight (foo . "bar"))
- `(progn
- (require 'foo nil nil)
- (if (fboundp 'diminish)
- (diminish 'foo "bar"))))))
-
-(ert-deftest use-package-test/:delight-6 ()
- (match-expansion
- (use-package foo :delight (foo "bar"))
- `(progn
- (require 'foo nil nil)
- (if (fboundp 'delight)
- (delight '((foo "bar" foo)))))))
-
-(ert-deftest use-package-test/334-1 ()
- (let (foo1-map foo2-map
- bar1-func1
- bar1-func2
- bar2-func1
- bar2-func2
- bar3-func1
- bar3-func2
- bar4-func1
- bar4-func2)
- (match-expansion
- (bind-keys :map foo1-map
- ("Y" . foo1)
- :prefix "y"
- :prefix-map bar1-prefix-map
- ("y" . bar1-func1)
- ("f" . bar1-func2)
- :prefix "y"
- :prefix-map bar2-prefix-map
- ("y" . bar2-func1)
- ("f" . bar2-func2)
- :map foo2-map
- ("Y" . foo2)
- :prefix "y"
- :prefix-map bar3-prefix-map
- ("y" . bar3-func1)
- ("f" . bar3-func2)
- :prefix "y"
- :prefix-map bar4-prefix-map
- ("y" . bar4-func1)
- ("f" . bar4-func2))
- `(progn
- (bind-key "Y" #'foo1 foo1-map nil)
- (defvar bar1-prefix-map)
- (define-prefix-command 'bar1-prefix-map)
- (bind-key "y" 'bar1-prefix-map foo1-map nil)
- (bind-key "y" #'bar1-func1 bar1-prefix-map nil)
- (bind-key "f" #'bar1-func2 bar1-prefix-map nil)
- (defvar bar2-prefix-map)
- (define-prefix-command 'bar2-prefix-map)
- (bind-key "y" 'bar2-prefix-map foo1-map nil)
- (bind-key "y" #'bar2-func1 bar2-prefix-map nil)
- (bind-key "f" #'bar2-func2 bar2-prefix-map nil)
- (bind-key "Y" #'foo2 foo2-map nil)
- (defvar bar3-prefix-map)
- (define-prefix-command 'bar3-prefix-map)
- (bind-key "y" 'bar3-prefix-map foo2-map nil)
- (bind-key "y" #'bar3-func1 bar3-prefix-map nil)
- (bind-key "f" #'bar3-func2 bar3-prefix-map nil)
- (defvar bar4-prefix-map)
- (define-prefix-command 'bar4-prefix-map)
- (bind-key "y" 'bar4-prefix-map foo2-map nil)
- (bind-key "y" #'bar4-func1 bar4-prefix-map nil)
- (bind-key "f" #'bar4-func2 bar4-prefix-map nil)))))
-
-(ert-deftest use-package-test/334-2 ()
- (let (w3m-lnum-mode-map
- w3m-print-current-url
- w3m-lnum-print-this-url
- w3m-print-this-url)
- (match-expansion
- (bind-keys :map w3m-lnum-mode-map
- :prefix "y"
- :prefix-map w3m-y-prefix-map
- ("y" . w3m-print-current-url)
- ("f" . w3m-lnum-print-this-url)
- ("t" . w3m-print-this-url))
- `(progn
- (defvar w3m-y-prefix-map)
- (define-prefix-command 'w3m-y-prefix-map)
- (bind-key "y" 'w3m-y-prefix-map w3m-lnum-mode-map nil)
- (bind-key "y" #'w3m-print-current-url w3m-y-prefix-map nil)
- (bind-key "f" #'w3m-lnum-print-this-url w3m-y-prefix-map nil)
- (bind-key "t" #'w3m-print-this-url w3m-y-prefix-map nil)))))
-
-(ert-deftest use-package-test/482-1 ()
- (match-expansion
- (use-package simple
- :bind-keymap ("C-t " . my/transpose-map)
- :bind (:map my/transpose-map
- ("w" . transpose-words)))
- `(progn
- (unless (fboundp 'transpose-words)
- (autoload #'transpose-words "simple" nil t))
- (bind-key "C-t "
- #'(lambda nil
- (interactive)
- (use-package-autoload-keymap 'my/transpose-map 'simple nil)))
- (bind-keys :package simple :map my/transpose-map
- ("w" . transpose-words)))))
-
-(ert-deftest use-package-test/482-2 ()
- (match-expansion
- (use-package simple
- :bind (:prefix-map my/transpose-map
- :prefix "C-t"
- ("w" . transpose-words)))
- `(progn
- (unless (fboundp 'transpose-words)
- (autoload #'transpose-words "simple" nil t))
- (bind-keys :package simple
- :prefix-map my/transpose-map
- :prefix "C-t"
- ("w" . transpose-words)))))
-
-(ert-deftest use-package-test/482-3 ()
- (match-expansion
- (bind-keys :package simple
- :prefix-map my/transpose-map
- :prefix "C-t"
- ("w" . transpose-words))
- `(progn
- (defvar my/transpose-map)
- (define-prefix-command 'my/transpose-map)
- (bind-key "C-t" 'my/transpose-map nil nil)
- (bind-key "w" #'transpose-words my/transpose-map nil))))
-
-(ert-deftest use-package-test/538 ()
- (match-expansion
- (use-package mu4e
- :commands (mu4e)
- :bind (("" . mu4e))
- :init
- :config
- (config))
- `(progn
- (unless (fboundp 'mu4e)
- (autoload #'mu4e "mu4e" nil t))
- (eval-after-load 'mu4e
- '(progn (config) t))
- (bind-keys :package mu4e ("" . mu4e)))))
-
-(ert-deftest use-package-test/543 ()
- (match-expansion
- (use-package hydra
- :ensure)
- `(progn
- (use-package-ensure-elpa 'hydra '(t) 'nil)
- (require 'hydra nil nil))))
-
-(ert-deftest use-package-test/545 ()
- (match-expansion
- (use-package spacemacs-theme
- :ensure t
- :init ; or :config
- (load-theme 'spacemacs-dark t)
- )
- `(progn
- (use-package-ensure-elpa 'spacemacs-theme '(t) 'nil)
- (load-theme 'spacemacs-dark t)
- (require 'spacemacs-theme nil nil))
- ))
-
-(ert-deftest use-package-test/550 ()
- (match-expansion
- (use-package company-try-hard
- :ensure t
- :bind
- ("C-c M-/" . company-try-hard)
- (:map company-active-map
- ("C-c M-/" . company-try-hard)))
- `(progn
- (use-package-ensure-elpa 'company-try-hard
- '(t)
- 'nil)
- (unless
- (fboundp 'company-try-hard)
- (autoload #'company-try-hard "company-try-hard" nil t))
- (bind-keys :package company-try-hard
- ("C-c M-/" . company-try-hard)
- :map company-active-map
- ("C-c M-/" . company-try-hard)))))
-
-(ert-deftest use-package-test/558 ()
- (match-expansion
- (bind-keys* :package org-ref
- ("C-c C-r" . org-ref-helm-insert-cite-link))
- `(bind-key "C-c C-r" #'org-ref-helm-insert-cite-link override-global-map nil)))
-
-(ert-deftest use-package-test/560 ()
- (cl-letf (((symbol-function #'executable-find) #'ignore))
- (let (notmuch-command)
- (match-expansion
- (use-package notmuch
- :preface (setq-default notmuch-command (executable-find "notmuch"))
- :if notmuch-command
- :requires foo
- :load-path "foo"
- :defines var)
- `(progn
- (eval-and-compile
- (add-to-list 'load-path ,(pred stringp)))
- (when (featurep 'foo)
- (eval-and-compile
- (setq-default notmuch-command
- (executable-find "notmuch")))
- (when (symbol-value 'notmuch-command)
- (require 'notmuch nil nil))))))))
-
-(ert-deftest use-package-test/572-1 ()
- (let ((use-package-always-defer t))
- (match-expansion
- (use-package auth-password-store
- :after auth-source
- :init
- (setq auth-sources '(password-store)))
- `(eval-after-load 'auth-source
- '(setq auth-sources '(password-store))))))
-
-(ert-deftest use-package-test/572-2 ()
- (let ((use-package-always-defer t))
- (match-expansion
- (use-package ivy-hydra :after ivy)
- `nil)))
-
-(ert-deftest use-package-test/572-3 ()
- (let ((use-package-always-defer t)
- (use-package-defaults
- (let ((defaults (copy-alist use-package-defaults)))
- (setcdr (assq :defer defaults)
- '(use-package-always-defer
- (lambda (name args)
- (and use-package-always-defer
- (not (plist-member args :after))
- (not (plist-member args :defer))
- (not (plist-member args :demand))))))
- defaults)))
- (match-expansion
- (use-package ivy-hydra :after ivy)
- `(eval-after-load 'ivy
- '(require 'ivy-hydra nil nil)))))
-
-(ert-deftest use-package-test/575-1 ()
- (match-expansion
- (use-package helm
- :defer t
- :after (:any ido dired)
- :config
- (message "test. helm start"))
- `(progn
- (defvar ,_ nil)
- (defvar ,_ nil)
- (defvar ,_
- #'(lambda nil
- (if ,_ ,_
- (setq ,_ t ,_
- (eval-after-load 'helm
- '(progn
- (message "test. helm start")
- t))))))
- (eval-after-load 'ido
- '(funcall ,_))
- (eval-after-load 'dired
- '(funcall ,_)))))
-
-(ert-deftest use-package-test/575-2 ()
- (match-expansion
- (use-package helm
- :defer t
- :bind ("C-c d" . helm-mini)
- :config
- (message "test. helm start"))
- `(progn
- (unless (fboundp 'helm-mini)
- (autoload #'helm-mini "helm" nil t))
- (eval-after-load 'helm
- '(progn
- (message "test. helm start")
- t))
- (bind-keys :package helm ("C-c d" . helm-mini)))))
-
-(ert-deftest use-package-test/585 ()
- (match-expansion
- (use-package bug
- :bind (:map bug-map ("C-a" . alpha))
- :bind (("C-b" . beta)))
- `(progn
- (unless (fboundp 'alpha)
- (autoload #'alpha "bug" nil t))
- (unless (fboundp 'beta)
- (autoload #'beta "bug" nil t))
- (bind-keys :package bug :map bug-map
- ("C-a" . alpha))
- (bind-keys :package bug
- ("C-b" . beta)))))
-
-(ert-deftest use-package-test/589 ()
- (let ((use-package-verbose t)
- (use-package-expand-minimally t)
- debug-on-error
- warnings)
- (cl-letf (((symbol-function #'display-warning)
- (lambda (_ msg _) (push msg warnings))))
- (progn
- (macroexpand-1
- '(use-package ediff :defer t (setq my-var t)))
- (should (= (and (> (length warnings) 0)
- (string-match ":defer wants exactly one argument"
- (car warnings))) 44))))))
-
-(ert-deftest use-package-test/591 ()
- (let ((use-package-defaults
- (cons '(:if (lambda (name _) `(locate-library ,name)) t)
- use-package-defaults)))
- (match-expansion
- (use-package nonexistent
- :hook lisp-mode)
- `(when (locate-library nonexistent)
- (unless (fboundp 'nonexistent-mode)
- (autoload #'nonexistent-mode "nonexistent" nil t))
- (add-hook 'lisp-mode-hook #'nonexistent-mode)))))
-
-(ert-deftest bind-key/:prefix-map ()
- (match-expansion
- (bind-keys :prefix ""
- :prefix-map my/map)
- `(progn
- (defvar my/map)
- (define-prefix-command 'my/map)
- (bind-key "" 'my/map nil nil))))
-
-
-(ert-deftest bind-key/845 ()
- (defvar test-map (make-keymap))
- (bind-key "" 'ignore 'test-map)
- (should (eq (lookup-key test-map (kbd "")) 'ignore))
- (let ((binding (cl-find "" personal-keybindings :test 'string= :key 'caar)))
- (message "test-map %s" test-map)
- (message "binding %s" binding)
- (should (eq (cdar binding) 'test-map))
- (should (eq (nth 1 binding) 'ignore))
- (should (eq (nth 2 binding) nil))))
-
-;; Local Variables:
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; End:
-
-;;; use-package-tests.el ends here
diff --git a/emacs.d/use-package/use-package.el b/emacs.d/use-package/use-package.el
deleted file mode 100644
index bafa093..0000000
--- a/emacs.d/use-package/use-package.el
+++ /dev/null
@@ -1,51 +0,0 @@
-;;; use-package.el --- A configuration macro for simplifying your .emacs -*- lexical-binding: t; -*-
-
-;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
-
-;; Author: John Wiegley
-;; Maintainer: John Wiegley
-;; Created: 17 Jun 2012
-;; Version: 2.4.4
-;; Package-Requires: ((emacs "24.3") (bind-key "2.4"))
-;; Keywords: dotemacs startup speed config package extensions
-;; URL: https://github.com/jwiegley/use-package
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;; The `use-package' declaration macro allows you to isolate package
-;; configuration in your ".emacs" in a way that is performance-oriented and,
-;; well, just tidy. I created it because I have over 80 packages that I use
-;; in Emacs, and things were getting difficult to manage. Yet with this
-;; utility my total load time is just under 1 second, with no loss of
-;; functionality!
-;;
-;; Please see README.md from the same repository for documentation.
-
-;;; Code:
-
-(require 'use-package-core)
-
-(require 'use-package-bind-key)
-(require 'use-package-diminish)
-(require 'use-package-delight)
-(require 'use-package-ensure)
-
-(declare-function use-package-jump-to-package-form "use-package-jump")
-(autoload #'use-package-jump-to-package-form "use-package-jump" nil t)
-
-(provide 'use-package)
-
-;;; use-package.el ends here
diff --git a/emacs.d/use-package/use-package.texi b/emacs.d/use-package/use-package.texi
deleted file mode 100644
index 573baac..0000000
--- a/emacs.d/use-package/use-package.texi
+++ /dev/null
@@ -1,946 +0,0 @@
-\input texinfo @c -*- texinfo -*-
-@c %**start of header
-@setfilename use-package.info
-@settitle use-package User Manual
-@documentencoding UTF-8
-@documentlanguage en
-@c %**end of header
-
-@copying
-@quotation
-Copyright (C) 2012-2022 Free Software Foundation, Inc.
-
-You can redistribute this document and/or modify it under the terms
-of the GNU General Public License as published by the Free Software
-Foundation, either version 3 of the License, or (at your option) any
-later version.
-
-This document is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@. See the GNU
-General Public License for more details.
-
-@end quotation
-@end copying
-
-@dircategory Emacs
-@direntry
-* use-package: (use-package). Declarative package configuration for Emacs.
-@end direntry
-
-@finalout
-@titlepage
-@title use-package User Manual
-@subtitle for version 2.4.1-119-g0be480e+1
-@author John Wiegley
-@page
-@vskip 0pt plus 1filll
-@insertcopying
-@end titlepage
-
-@contents
-
-@ifnottex
-@node Top
-@top use-package User Manual
-
-The @code{use-package} macro allows you to isolate package configuration in your
-@code{.emacs} file in a way that is both performance-oriented and, well, tidy. I
-created it because I have over 80 packages that I use in Emacs, and things
-were getting difficult to manage. Yet with this utility my total load time is
-around 2 seconds, with no loss of functionality!
-
-@insertcopying
-@end ifnottex
-
-@menu
-* Introduction::
-* Installation::
-* Getting Started::
-* Basic Concepts::
-* Issues/Requests::
-* Keywords::
-* Debugging Tools::
-
-@detailmenu
---- The Detailed Node Listing ---
-
-Installation
-
-* Installing from GNU ELPA::
-* Installing from the Git Repository::
-* Post-Installation Tasks::
-
-Keywords
-
-* @code{after}:: @code{:after}.
-* @code{bind-keymap} @code{bind-keymap*}:: @code{:bind-keymap}, @code{:bind-keymap*}.
-* @code{bind} @code{bind*}:: @code{:bind}, @code{:bind*}.
-* @code{commands}:: @code{:commands}.
-* @code{preface} @code{init} @code{config}:: @code{:preface}, @code{:init}, @code{:config}.
-* @code{custom}:: @code{:custom}.
-* @code{custom-face}:: @code{:custom-face}.
-* @code{defer} @code{demand}:: @code{:defer}, @code{:demand}.
-* @code{defines} @code{functions}:: @code{:defines}, @code{:functions}.
-* @code{diminish} @code{delight}:: @code{:diminish}, @code{:delight}.
-* @code{disabled}:: @code{:disabled}.
-* @code{ensure} @code{pin}:: @code{:ensure}, @code{:pin}.
-* @code{hook}:: @code{:hook}.
-* @code{if} @code{when} @code{unless}:: @code{:if}, @code{:when}, @code{:unless}.
-* @code{load-path}:: @code{:load-path}.
-* @code{mode} @code{interpreter}:: @code{:mode}, @code{:interpreter}.
-* @code{magic} @code{magic-fallback}:: @code{:magic}, @code{:magic-fallback}.
-* @code{no-require}:: @code{:no-require}.
-* @code{requires}:: @code{:requires}.
-
-@code{bind}, @code{bind*}
-
-* Binding to local keymaps::
-
-
-@end detailmenu
-@end menu
-
-@node Introduction
-@chapter Introduction
-
-The @code{use-package} macro allows you to isolate package configuration in your
-@code{.emacs} file in a way that is both performance-oriented and, well, tidy. I
-created it because I have over 80 packages that I use in Emacs, and things
-were getting difficult to manage. Yet with this utility my total load time is
-around 2 seconds, with no loss of functionality!
-
-More text to come@dots{}
-
-@node Installation
-@chapter Installation
-
-use-package can be installed using Emacs' package manager or manually from
-its development repository.
-
-@menu
-* Installing from GNU ELPA::
-* Installing from the Git Repository::
-* Post-Installation Tasks::
-@end menu
-
-@node Installing from GNU ELPA
-@section Installing from GNU ELPA
-
-use-package is available from GNU ELPA. If you haven't used
-Emacs' package manager before, then it is high time you familiarize yourself
-with it by reading the documentation in the Emacs manual, see
-@ref{Packages,,,emacs,}. Then add one of the archives to @code{package-archives}:
-
-First, you need to update the local package list using:
-
-@example
-M-x package-refresh-contents RET
-@end example
-
-Once you have done that, you can install use-package and its
-dependencies using:
-
-@example
-M-x package-install RET use-package RET
-@end example
-
-Now see @ref{Post-Installation Tasks}.
-
-@node Installing from the Git Repository
-@section Installing from the Git Repository
-
-First, use Git to clone the use-package repository:
-
-@example
-$ git clone https://github.com/jwiegley/use-package.git ~/.emacs.d/site-lisp/use-package
-$ cd ~/.emacs.d/site-lisp/use-package
-@end example
-
-Then compile the libraries and generate the info manuals:
-
-@example
-$ make
-@end example
-
-You may need to create @code{/path/to/use-package/config.mk} with the following
-content before running @code{make}:
-
-@example
-LOAD_PATH = -L /path/to/use-package
-@end example
-
-Finally add this to your init file:
-
-@lisp
-(add-to-list 'load-path "~/.emacs.d/site-lisp/use-package")
-(require 'use-package)
-
-(with-eval-after-load 'info
- (info-initialize)
- (add-to-list 'Info-directory-list
- "~/.emacs.d/site-lisp/use-package/"))
-@end lisp
-
-Note that elements of @code{load-path} should not end with a slash, while those of
-@code{Info-directory-list} should.
-
-Instead of running use-package directly from the repository by adding it to
-the @code{load-path}, you might want to instead install it in some other directory
-using @code{sudo make install} and setting @code{load-path} accordingly.
-
-To update use-package use:
-
-@example
-$ git pull
-$ make
-@end example
-
-At times it might be necessary to run @code{make clean all} instead.
-
-To view all available targets use @code{make help}.
-
-Now see @ref{Post-Installation Tasks}.
-
-@node Post-Installation Tasks
-@section Post-Installation Tasks
-
-After installing use-package you should verify that you are indeed using the
-use-package release you think you are using. It's best to restart Emacs before
-doing so, to make sure you are not using an outdated value for @code{load-path}.
-
-@example
-C-h v use-package-version RET
-@end example
-
-should display something like
-
-@example
-use-package-version’s value is "2.4.3"
-@end example
-
-If you are completely new to use-package then see @ref{Getting Started}.
-
-If you run into problems, then please see the @ref{Debugging Tools}.
-
-@node Getting Started
-@chapter Getting Started
-
-TODO@. For now, see @code{README.md}.
-
-@node Basic Concepts
-@chapter Basic Concepts
-
-@code{use-package} was created for few basic reasons, each of which drove the
-design in various ways. Understanding these reasons may help make some of
-those decisions clearer:
-
-@itemize
-@item
-To gather all configuration details of a package into one place,
-making it easier to copy, disable, or move it elsewhere in the init
-file.
-
-@item
-To reduce duplication and boilerplate, capturing several common
-practices as mere keywords both easy and intuitive to use.
-
-@item
-To make startup time of Emacs as quick as possible, without
-sacrificing the quantity of add-on packages used.
-
-@item
-To make it so errors encountered during startup disable only the
-package raising the error, and as little else as possible, leaving a
-close to a functional Emacs as possible.
-
-@item
-To allow byte-compilation of one's init file so that any warnings or
-errors seen are meaningful. In this way, even if byte-compilation is not
-used for speed (reason 3), it can still be used as a sanity check.
-@end itemize
-
-@node Issues/Requests
-@chapter Issues/Requests
-
-@node Keywords
-@chapter Keywords
-
-@menu
-* @code{after}:: @code{after}.
-* @code{bind-keymap} @code{bind-keymap*}:: @code{:bind-keymap}, @code{:bind-keymap*}.
-* @code{bind} @code{bind*}:: @code{bind} @code{:bind*}.
-* @code{commands}:: @code{:commands}.
-* @code{preface} @code{init} @code{config}:: @code{:preface}, @code{:init}, @code{:config}.
-* @code{custom}:: @code{:custom}.
-* @code{custom-face}:: @code{:custom-face}.
-* @code{defer} @code{demand}:: @code{:defer}, @code{:demand}.
-* @code{defines} @code{functions}:: @code{:defines}, @code{:functions}.
-* @code{diminish} @code{delight}:: @code{:diminish}, @code{:delight}.
-* @code{disabled}:: @code{:disabled}.
-* @code{ensure} @code{pin}:: @code{:ensure}, @code{:pin}.
-* @code{hook}:: @code{:hook}.
-* @code{if} @code{when} @code{unless}:: @code{:if}, @code{:when}, @code{:unless}.
-* @code{load-path}:: @code{:load-path}.
-* @code{mode} @code{interpreter}:: @code{:mode}, @code{:interpreter}.
-* @code{magic} @code{magic-fallback}:: @code{:magic}, @code{:magic-fallback}.
-* @code{no-require}:: @code{:no-require}.
-* @code{requires}:: @code{:requires}.
-@end menu
-
-@node @code{after}
-@section @code{:after}
-
-Sometimes it only makes sense to configure a package after another has been
-loaded, because certain variables or functions are not in scope until that
-time. This can achieved using an @code{:after} keyword that allows a fairly rich
-description of the exact conditions when loading should occur. Here is an
-example:
-
-@lisp
-(use-package hydra
- :load-path "site-lisp/hydra")
-
-(use-package ivy
- :load-path "site-lisp/swiper")
-
-(use-package ivy-hydra
- :after (ivy hydra))
-@end lisp
-
-In this case, because all of these packages are demand-loaded in the order
-they occur, the use of @code{:after} is not strictly necessary. By using it,
-however, the above code becomes order-independent, without an implicit
-depedence on the nature of your init file.
-
-By default, @code{:after (foo bar)} is the same as @code{:after (:all foo bar)}, meaning
-that loading of the given package will not happen until both @code{foo} and @code{bar}
-have been loaded. Here are some of the other possibilities:
-
-@lisp
-:after (foo bar)
-:after (:all foo bar)
-:after (:any foo bar)
-:after (:all (:any foo bar) (:any baz quux))
-:after (:any (:all foo bar) (:all baz quux))
-@end lisp
-
-When you nest selectors, such as @code{(:any (:all foo bar) (:all baz quux))}, it
-means that the package will be loaded when either both @code{foo} and @code{bar} have
-been loaded, or both @code{baz} and @code{quux} have been loaded.
-
-@strong{NOTE}: Pay attention if you set @code{use-package-always-defer} to t, and also use
-the @code{:after} keyword, as you will need to specify how the declared package is
-to be loaded: e.g., by some @code{:bind}. If you're not using one of the mechanisms
-that registers autoloads, such as @code{:bind} or @code{:hook}, and your package manager
-does not provide autoloads, it's possible that without adding @code{:demand t} to
-those declarations, your package will never be loaded.
-
-@node @code{bind-keymap} @code{bind-keymap*}
-@section @code{:bind-keymap}, @code{:bind-keymap*}
-
-Normally @code{:bind} expects that commands are functions that will be autoloaded
-from the given package. However, this does not work if one of those commands
-is actually a keymap, since keymaps are not functions, and cannot be
-autoloaded using Emacs' @code{autoload} mechanism.
-
-To handle this case, @code{use-package} offers a special, limited variant of
-@code{:bind} called @code{:bind-keymap}. The only difference is that the "commands"
-bound to by @code{:bind-keymap} must be keymaps defined in the package, rather than
-command functions. This is handled behind the scenes by generating custom code
-that loads the package containing the keymap, and then re-executes your
-keypress after the first load, to reinterpret that keypress as a prefix key.
-
-For example:
-
-@lisp
-(use-package projectile
- :bind-keymap
- ("C-c p" . projectile-command-map)
-@end lisp
-
-@node @code{bind} @code{bind*}
-@section @code{:bind}, @code{:bind*}
-
-Another common thing to do when loading a module is to bind a key to primary
-commands within that module:
-
-@lisp
-(use-package ace-jump-mode
- :bind ("C-." . ace-jump-mode))
-@end lisp
-
-This does two things: first, it creates an autoload for the @code{ace-jump-mode}
-command and defers loading of @code{ace-jump-mode} until you actually use it.
-Second, it binds the key @code{C-.} to that command. After loading, you can use
-@code{M-x describe-personal-keybindings} to see all such keybindings you've set
-throughout your @code{.emacs} file.
-
-A more literal way to do the exact same thing is:
-
-@lisp
-(use-package ace-jump-mode
- :commands ace-jump-mode
- :init
- (bind-key "C-." 'ace-jump-mode))
-@end lisp
-
-When you use the @code{:commands} keyword, it creates autoloads for those commands
-and defers loading of the module until they are used. Since the @code{:init} form
-is always run---even if @code{ace-jump-mode} might not be on your system---remember
-to restrict @code{:init} code to only what would succeed either way.
-
-The @code{:bind} keyword takes either a cons or a list of conses:
-
-@lisp
-(use-package hi-lock
- :bind (("M-o l" . highlight-lines-matching-regexp)
- ("M-o r" . highlight-regexp)
- ("M-o w" . highlight-phrase)))
-@end lisp
-
-The @code{:commands} keyword likewise takes either a symbol or a list of symbols.
-
-NOTE: Special keys like @code{tab} or @code{F1}-@code{Fn} can be written in square brackets,
-i.e. @code{[tab]} instead of @code{"tab"}. The syntax for the keybindings is similar to
-the "kbd" syntax: see @uref{https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-Rebinding.html, the Emacs Manual} for more information.
-
-Examples:
-
-@lisp
-(use-package helm
- :bind (("M-x" . helm-M-x)
- ("M-" . helm-find-files)
- ([f10] . helm-buffers-list)
- ([S-f10] . helm-recentf)))
-@end lisp
-
-@menu
-* Binding to local keymaps::
-@end menu
-
-@node Binding to local keymaps
-@subsection Binding to local keymaps
-
-Slightly different from binding a key to a keymap, is binding a key @strong{within} a
-local keymap that only exists after the package is loaded. @code{use-package}
-supports this with a @code{:map} modifier, taking the local keymap to bind to:
-
-@lisp
-(use-package helm
- :bind (:map helm-command-map
- ("C-c h" . helm-execute-persistent-action)))
-@end lisp
-
-The effect of this statement is to wait until @code{helm} has loaded, and then to
-bind the key @code{C-c h} to @code{helm-execute-persistent-action} within Helm's local
-keymap, @code{helm-mode-map}.
-
-Multiple uses of @code{:map} may be specified. Any binding occurring before the
-first use of @code{:map} are applied to the global keymap:
-
-@lisp
-(use-package term
- :bind (("C-c t" . term)
- :map term-mode-map
- ("M-p" . term-send-up)
- ("M-n" . term-send-down)
- :map term-raw-map
- ("M-o" . other-window)
- ("M-p" . term-send-up)
- ("M-n" . term-send-down)))
-@end lisp
-
-@node @code{commands}
-@section @code{:commands}
-
-@node @code{preface} @code{init} @code{config}
-@section @code{:preface}, @code{:init}, @code{:config}
-
-Here is the simplest @code{use-package} declaration:
-
-@lisp
-;; This is only needed once, near the top of the file
-(eval-when-compile
- ;; Following line is not needed if use-package.el is in ~/.emacs.d
- (add-to-list 'load-path "")
- (require 'use-package))
-
-(use-package foo)
-@end lisp
-
-This loads in the package @code{foo}, but only if @code{foo} is available on your
-system. If not, a warning is logged to the @code{*Messages*} buffer. If it
-succeeds, a message about @code{"Loading foo"} is logged, along with the time it
-took to load, if it took over 0.1 seconds.
-
-Use the @code{:init} keyword to execute code before a package is loaded. It
-accepts one or more forms, up until the next keyword:
-
-@lisp
-(use-package foo
- :init
- (setq foo-variable t))
-@end lisp
-
-Similarly, @code{:config} can be used to execute code after a package is loaded.
-In cases where loading is done lazily (see more about autoloading below), this
-execution is deferred until after the autoload occurs:
-
-@lisp
-(use-package foo
- :init
- (setq foo-variable t)
- :config
- (foo-mode 1))
-@end lisp
-
-As you might expect, you can use @code{:init} and @code{:config} together:
-
-@lisp
-(use-package color-moccur
- :commands (isearch-moccur isearch-all)
- :bind (("M-s O" . moccur)
- :map isearch-mode-map
- ("M-o" . isearch-moccur)
- ("M-O" . isearch-moccur-all))
- :init
- (setq isearch-lazy-highlight t)
- :config
- (use-package moccur-edit))
-@end lisp
-
-In this case, I want to autoload the commands @code{isearch-moccur} and
-@code{isearch-all} from @code{color-moccur.el}, and bind keys both at the global level
-and within the @code{isearch-mode-map} (see next section). When the package is
-actually loaded (by using one of these commands), @code{moccur-edit} is also
-loaded, to allow editing of the @code{moccur} buffer.
-
-@node @code{custom}
-@section @code{:custom}
-
-The @code{:custom} keyword allows customization of package custom variables.
-
-@lisp
-(use-package comint
- :custom
- (comint-buffer-maximum-size 20000 "Increase comint buffer size.")
- (comint-prompt-read-only t "Make the prompt read only."))
-@end lisp
-
-The documentation string is not mandatory.
-
-@node @code{custom-face}
-@section @code{:custom-face}
-
-The @code{:custom-face} keyword allows customization of package custom faces.
-
-@lisp
-(use-package eruby-mode
- :custom-face
- (eruby-standard-face ((t (:slant italic)))))
-@end lisp
-
-@node @code{defer} @code{demand}
-@section @code{:defer}, @code{:demand}
-
-In almost all cases you don't need to manually specify @code{:defer t}. This is
-implied whenever @code{:bind} or @code{:mode} or @code{:interpreter} is used. Typically, you
-only need to specify @code{:defer} if you know for a fact that some other package
-will do something to cause your package to load at the appropriate time, and
-thus you would like to defer loading even though use-package isn't creating
-any autoloads for you.
-
-You can override package deferral with the @code{:demand} keyword. Thus, even if
-you use @code{:bind}, using @code{:demand} will force loading to occur immediately and
-not establish an autoload for the bound key.
-
-@node @code{defines} @code{functions}
-@section @code{:defines}, @code{:functions}
-
-Another feature of @code{use-package} is that it always loads every file that it
-can when @code{.emacs} is being byte-compiled. This helps to silence spurious
-warnings about unknown variables and functions.
-
-However, there are times when this is just not enough. For those times, use
-the @code{:defines} and @code{:functions} keywords to introduce dummy variable and
-function declarations solely for the sake of the byte-compiler:
-
-@lisp
-(use-package texinfo
- :defines texinfo-section-list
- :commands texinfo-mode
- :init
- (add-to-list 'auto-mode-alist '("\\.texi$" . texinfo-mode)))
-@end lisp
-
-If you need to silence a missing function warning, you can use @code{:functions}:
-
-@lisp
-(use-package ruby-mode
- :mode "\\.rb\\'"
- :interpreter "ruby"
- :functions inf-ruby-keys
- :config
- (defun my-ruby-mode-hook ()
- (require 'inf-ruby)
- (inf-ruby-keys))
-
- (add-hook 'ruby-mode-hook 'my-ruby-mode-hook))
-@end lisp
-
-@node @code{diminish} @code{delight}
-@section @code{:diminish}, @code{:delight}
-
-@code{use-package} also provides built-in support for the diminish and delight
-utilities---if you have them installed. Their purpose is to remove or change
-minor mode strings in your mode-line.
-
-@uref{https://github.com/myrjola/diminish.el, diminish} is invoked with the @code{:diminish} keyword, which is passed either a
-minor mode symbol, a cons of the symbol and its replacement string, or just a
-replacement string, in which case the minor mode symbol is guessed to be the
-package name with "-mode" appended at the end:
-
-@lisp
-(use-package abbrev
- :diminish abbrev-mode
- :config
- (if (file-exists-p abbrev-file-name)
- (quietly-read-abbrev-file)))
-@end lisp
-
-@uref{https://elpa.gnu.org/packages/delight.html, delight} is invoked with the @code{:delight} keyword, which is passed a minor mode
-symbol, a replacement string or quoted @uref{https://www.gnu.org/software/emacs/manual/html_node/elisp/Mode-Line-Data.html, mode-line data} (in which case the minor
-mode symbol is guessed to be the package name with "-mode" appended at the
-end), both of these, or several lists of both. If no arguments are provided,
-the default mode name is hidden completely.
-
-@lisp
-;; Don't show anything for rainbow-mode.
-(use-package rainbow-mode
- :delight)
-
-;; Don't show anything for auto-revert-mode, which doesn't match
-;; its package name.
-(use-package autorevert
- :delight auto-revert-mode)
-
-;; Remove the mode name for projectile-mode, but show the project name.
-(use-package projectile
- :delight '(:eval (concat " " (projectile-project-name))))
-
-;; Completely hide visual-line-mode and change auto-fill-mode to " AF".
-(use-package emacs
- :delight
- (auto-fill-function " AF")
- (visual-line-mode))
-@end lisp
-
-@node @code{disabled}
-@section @code{:disabled}
-
-The @code{:disabled} keyword can turn off a module you're having difficulties with,
-or stop loading something you're not using at the present time:
-
-@lisp
-(use-package ess-site
- :disabled
- :commands R)
-@end lisp
-
-When byte-compiling your @code{.emacs} file, disabled declarations are omitted
-from the output entirely, to accelerate startup times.
-
-@node @code{ensure} @code{pin}
-@section @code{:ensure}, @code{:pin}
-
-You can use @code{use-package} to load packages from ELPA with @code{package.el}. This
-is particularly useful if you share your @code{.emacs} among several machines; the
-relevant packages are downloaded automatically once declared in your @code{.emacs}.
-The @code{:ensure} keyword causes the package(s) to be installed automatically if
-not already present on your system (set @code{(setq use-package-always-ensure t)}
-if you wish this behavior to be global for all packages):
-
-@lisp
-(use-package magit
- :ensure t)
-@end lisp
-
-If you need to install a different package from the one named by
-@code{use-package}, you can specify it like this:
-
-@lisp
-(use-package tex
- :ensure auctex)
-@end lisp
-
-Lastly, when running on Emacs 24.4 or later, use-package can pin a package to
-a specific archive, allowing you to mix and match packages from different
-archives. The primary use-case for this is preferring packages from the
-@code{melpa-stable} and @code{gnu} archives, but using specific packages from @code{melpa}
-when you need to track newer versions than what is available in the @code{stable}
-archives is also a valid use-case.
-
-By default @code{package.el} prefers @code{melpa} over @code{melpa-stable} due to the
-versioning @code{(> evil-20141208.623 evil-1.0.9)}, so even if you are tracking
-only a single package from @code{melpa}, you will need to tag all the non-@code{melpa}
-packages with the appropriate archive. If this really annoys you, then you can
-set @code{use-package-always-pin} to set a default.
-
-If you want to manually keep a package updated and ignore upstream updates,
-you can pin it to @code{manual}, which as long as there is no repository by that
-name, will Just Work(tm).
-
-@code{use-package} throws an error if you try to pin a package to an archive that
-has not been configured using @code{package-archives} (apart from the magic
-@code{manual} archive mentioned above):
-
-@example
-Archive 'foo' requested for package 'bar' is not available.
-@end example
-
-Example:
-
-@lisp
-(use-package company
- :ensure t
- :pin melpa-stable)
-
-(use-package evil
- :ensure t)
- ;; no :pin needed, as package.el will choose the version in melpa
-
-(use-package adaptive-wrap
- :ensure t
- ;; as this package is available only in the gnu archive, this is
- ;; technically not needed, but it helps to highlight where it
- ;; comes from
- :pin gnu)
-
-(use-package org
- :ensure t
- ;; ignore org-mode from upstream and use a manually installed version
- :pin manual)
-@end lisp
-
-@strong{NOTE}: the @code{:pin} argument has no effect on emacs versions < 24.4.
-
-@node @code{hook}
-@section @code{:hook}
-
-The @code{:hook} keyword allows adding functions onto hooks, here only the basename
-of the hook is required. Thus, all of the following are equivalent:
-
-@lisp
-(use-package ace-jump-mode
- :hook prog-mode)
-
-(use-package ace-jump-mode
- :hook (prog-mode . ace-jump-mode))
-
-(use-package ace-jump-mode
- :commands ace-jump-mode
- :init
- (add-hook 'prog-mode-hook #'ace-jump-mode))
-@end lisp
-
-And likewise, when multiple hooks should be applied, the following are also
-equivalent:
-
-@lisp
-(use-package ace-jump-mode
- :hook (prog-mode text-mode))
-
-(use-package ace-jump-mode
- :hook ((prog-mode text-mode) . ace-jump-mode))
-
-(use-package ace-jump-mode
- :hook ((prog-mode . ace-jump-mode)
- (text-mode . ace-jump-mode)))
-
-(use-package ace-jump-mode
- :commands ace-jump-mode
- :init
- (add-hook 'prog-mode-hook #'ace-jump-mode)
- (add-hook 'text-mode-hook #'ace-jump-mode))
-@end lisp
-
-The use of @code{:hook}, as with @code{:bind}, @code{:mode}, @code{:interpreter}, etc., causes the
-functions being hooked to implicitly be read as @code{:commands} (meaning they will
-establish interactive @code{autoload} definitions for that module, if not already
-defined as functions), and so @code{:defer t} is also implied by @code{:hook}.
-
-@node @code{if} @code{when} @code{unless}
-@section @code{:if}, @code{:when}, @code{:unless}
-
-You can use the @code{:if} keyword to predicate the loading and initialization of
-modules.
-
-For example, I only want @code{edit-server} running for my main, graphical Emacs,
-not for other Emacsen I may start at the command line:
-
-@lisp
-(use-package edit-server
- :if window-system
- :init
- (add-hook 'after-init-hook 'server-start t)
- (add-hook 'after-init-hook 'edit-server-start t))
-@end lisp
-
-In another example, we can load things conditional on the operating system:
-
-@lisp
-(use-package exec-path-from-shell
- :if (memq window-system '(mac ns))
- :ensure t
- :config
- (exec-path-from-shell-initialize))
-@end lisp
-
-Note that @code{:when} is provided as an alias for @code{:if}, and @code{:unless foo} means
-the same thing as @code{:if (not foo)}.
-
-@node @code{load-path}
-@section @code{:load-path}
-
-If your package needs a directory added to the @code{load-path} in order to load,
-use @code{:load-path}. This takes a symbol, a function, a string or a list of
-strings. If the path is relative, it is expanded within
-@code{user-emacs-directory}:
-
-@lisp
-(use-package ess-site
- :load-path "site-lisp/ess/lisp/"
- :commands R)
-@end lisp
-
-Note that when using a symbol or a function to provide a dynamically generated
-list of paths, you must inform the byte-compiler of this definition so the
-value is available at byte-compilation time. This is done by using the special
-form @code{eval-and-compile} (as opposed to @code{eval-when-compile}). Further, this
-value is fixed at whatever was determined during compilation, to avoid looking
-up the same information again on each startup:
-
-@lisp
-(eval-and-compile
- (defun ess-site-load-path ()
- (shell-command "find ~ -path ess/lisp")))
-
-(use-package ess-site
- :load-path (lambda () (list (ess-site-load-path)))
- :commands R)
-@end lisp
-
-@node @code{mode} @code{interpreter}
-@section @code{:mode}, @code{:interpreter}
-
-Similar to @code{:bind}, you can use @code{:mode} and @code{:interpreter} to establish a
-deferred binding within the @code{auto-mode-alist} and @code{interpreter-mode-alist}
-variables. The specifier to either keyword can be a cons cell, a list of cons
-cells, or a string or regexp:
-
-@lisp
-(use-package ruby-mode
- :mode "\\.rb\\'"
- :interpreter "ruby")
-
-;; The package is "python" but the mode is "python-mode":
-(use-package python
- :mode ("\\.py\\'" . python-mode)
- :interpreter ("python" . python-mode))
-@end lisp
-
-If you aren't using @code{:commands}, @code{:bind}, @code{:bind*}, @code{:bind-keymap},
-@code{:bind-keymap*}, @code{:mode}, or @code{:interpreter} (all of which imply @code{:defer}; see
-the docstring for @code{use-package} for a brief description of each), you can
-still defer loading with the @code{:defer} keyword:
-
-@lisp
-(use-package ace-jump-mode
- :defer t
- :init
- (autoload 'ace-jump-mode "ace-jump-mode" nil t)
- (bind-key "C-." 'ace-jump-mode))
-@end lisp
-
-This does exactly the same thing as the following:
-
-@lisp
-(use-package ace-jump-mode
- :bind ("C-." . ace-jump-mode))
-@end lisp
-
-@node @code{magic} @code{magic-fallback}
-@section @code{:magic}, @code{:magic-fallback}
-
-Similar to @code{:mode} and @code{:interpreter}, you can also use @code{:magic} and
-@code{:magic-fallback} to cause certain function to be run if the beginning of a
-file matches a given regular expression. The difference between the two is
-that @code{:magic-fallback} has a lower priority than @code{:mode}. For example:
-
-@lisp
-(use-package pdf-tools
- :load-path "site-lisp/pdf-tools/lisp"
- :magic ("%PDF" . pdf-view-mode)
- :config
- (pdf-tools-install))
-@end lisp
-
-This registers an autoloaded command for @code{pdf-view-mode}, defers loading of
-@code{pdf-tools}, and runs @code{pdf-view-mode} if the beginning of a buffer matches the
-string @code{"%PDF"}.
-
-@node @code{no-require}
-@section @code{:no-require}
-
-Normally, @code{use-package} will load each package at compile time before
-compiling the configuration, to ensure that any necessary symbols are in scope
-to satisfy the byte-compiler. At times this can cause problems, since a
-package may have special loading requirements, and all that you want to use
-@code{use-package} for is to add a configuration to the @code{eval-after-load} hook. In
-such cases, use the @code{:no-require} keyword:
-
-@lisp
-(use-package foo
- :no-require t
- :config
- (message "This is evaluated when `foo' is loaded"))
-@end lisp
-
-@node @code{requires}
-@section @code{:requires}
-
-While the @code{:after} keyword delays loading until the dependencies are loaded,
-the somewhat simpler @code{:requires} keyword simply never loads the package if the
-dependencies are not available at the time the @code{use-package} declaration is
-encountered. By "available" in this context it means that @code{foo} is available
-of @code{(featurep 'foo)} evaluates to a non-nil value. For example:
-
-@lisp
-(use-package abbrev
- :requires foo)
-@end lisp
-
-This is the same as:
-
-@lisp
-(use-package abbrev
- :if (featurep 'foo))
-@end lisp
-
-As a convenience, a list of such packages may be specified:
-
-@lisp
-(use-package abbrev
- :requires (foo bar baz))
-@end lisp
-
-For more complex logic, such as that supported by @code{:after}, simply use @code{:if}
-and the appropriate Lisp expression.
-
-@node Debugging Tools
-@chapter Debugging Tools
-
-TODO
-
-@bye
diff --git a/emacs.d/vendor/xit-mode.el b/emacs.d/vendor/xit-mode.el
deleted file mode 100644
index ad5834f..0000000
--- a/emacs.d/vendor/xit-mode.el
+++ /dev/null
@@ -1,133 +0,0 @@
-;;; xit-mode.el --- A [x]it! major mode for Emacs. -*- lexical-binding: t; -*-
-
-;; See: https://xit.jotaen.net/
-
-;; Copyright (C) 2022 Ryan Olson
-
-;; Authors: Ryan Olson
-;; Keywords: xit todo
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;;
-
-;;; Code:
-
-(defvar xit-mode-hook nil)
-
-;; (defvar xit-mode-map
-;; (let ((map (make-sparse-keymap)))
-;; (define-key map "\C-j" 'newline-and-indent)
-;; map)
-;; "Keymap for `xit-mode'.")
-
-;;;###autoload
-(add-to-list 'auto-mode-alist '("\\.xit\\'" . xit-mode))
-
-;; descriptions disabled until tags in descriptions are resolved.
-;; right now tags don't display if a description has a face.
-(defvar xit-mode-font-lock-keywords
- (list
- '("^[a-zA-Z]+.*$" 0 'xit-group-title)
- '("^\\(\\[ \\]\\) [\\!|\\.]*\\(.*\\)"
- (1 'xit-open-checkbox))
- ;(2 'xit-open-description))
- '("^\\(\\[x\\]\\) \\(.*\\)"
- (1 'xit-checked-checkbox))
- ;(2 'xit-checked-description))
- '("^\\(\\[@\\]\\) [\\!|\\.]*\\(.*\\)"
- (1 'xit-ongoing-checkbox))
- ;(2 'xit-ongoing-description))
- '("^\\(\\[~\\]\\) \\(.*\\)"
- (1 'xit-obsolete-checkbox)
- (2 'xit-obsolete-description))
- '("^\\[[x|@| |~]\\] \\([\\!|\\.]+\\)[^\\!|\\.]" 1 'xit-priority)
- '("\s#[a-zA-Z0-9\\-_]+\\(=[a-zA-Z0-9\\-+]+\\)?\\w" 0 'xit-tag)
- '("\s->\s\\([1-2][0-1][0-9][0-9]-[0-1][0-9]\\(-[0-3][0-9]\\)?\\)" 1 'xit-due-date))
- "Highlighting specification for `xit-mode'.")
-
-(defface xit-group-title
- '((t :inherit (font-lock-string-face underline)))
- "Face used for checkboxes group title"
- :group 'xit-faces)
-
-(defface xit-open-checkbox
- '((t :inherit font-lock-type-face))
- "Face used for open checkbox."
- :group 'xit-faces)
-
-(defface xit-open-description
- '((t :inherit default))
- "Face used for open checkbox description."
- :group 'xit-faces)
-
-(defface xit-checked-checkbox
- '((t :inherit success))
- "Face used for checked checkbox."
- :group 'xit-faces)
-
-(defface xit-checked-description
- '((t :foreground "#838383"))
- "Face used for checked checkbox description."
- :group 'xit-faces)
-
-(defface xit-ongoing-checkbox
- '((t :inherit font-lock-keyword-face))
- "Face used for ongoing checkbox."
- :group 'xit-faces)
-
-(defface xit-ongoing-description
- '((t :inherit default))
- "Face used for ongoing checkbox description."
- :group 'xit-faces)
-
-(defface xit-obsolete-checkbox
- '((t :foreground "#838383"))
- "Face used for obsolete checkbox."
- :group 'xit-faces)
-
-(defface xit-obsolete-description
- '((t :foreground "#838383"))
- "Face used for obsolete checkbox description."
- :group 'xit-faces)
-
-(defface xit-priority
- '((t :inherit error))
- "Face used for priority markers ! or ."
- :group 'xit-faces)
-
-(defface xit-tag
- '((t :inherit font-lock-constant-face))
- "Face used for tags."
- :group 'xit-faces)
-
-(defface xit-due-date
- '((t :inherit font-lock-variable-name-face))
- "Face used for due dates."
- :group 'xit-faces)
-
-(defun xit-mode ()
- "Major mode for [x]it!"
- (interactive)
- (kill-all-local-variables)
- ;;(use-local-map xit-mode-map)
- (setq font-lock-defaults '(xit-mode-font-lock-keywords))
- (setq major-mode 'xit-mode)
- (setq mode-name "[x]it!")
- (run-hooks 'xit-mode-hook))
-
-(provide 'xit-mode)
-;;; xit-mode.el ends here
diff --git a/gitconfig b/gitconfig
index 9de2bf7..ffee3f0 100644
--- a/gitconfig
+++ b/gitconfig
@@ -16,7 +16,7 @@
d = diff --color --minimal
dc = diff --color --minimal --cached
g = grep -p
- dm = diff origin/master
+ dm = diff origin/main
[diff]
compactionHeuristic = true
algorithm = histogram
diff --git a/starship.toml b/starship.toml
index f2a3529..99ead8d 100644
--- a/starship.toml
+++ b/starship.toml
@@ -1,4 +1,5 @@
add_newline = true
+command_timeout = 800
[[battery.display]]
threshold = 10
@@ -21,3 +22,6 @@ disabled = true
[username]
disabled = true
+
+[nodejs]
+disabled = true
diff --git a/zshrc.d/.env.zsh b/zshrc.d/.env.zsh
index 8faa820..ae1bea3 100644
--- a/zshrc.d/.env.zsh
+++ b/zshrc.d/.env.zsh
@@ -25,18 +25,13 @@ export EDITOR="emacs -nw -Q"
export GOPATH=~/go
# Configure virtualenv
-export WORKON_HOME=~/.env
export PYTHONDONTWRITEBYTECODE=1
-# Configure dotnet
-# DEV: Opt out of telemetry
-export DOTNET_CLI_TELEMETRY_OPTOUT=1
-
-# Configure RVM
-export rvm_project_rvmrc=1
-
-# Configure NVM
-export NVM_DIR=~/.nvm
+# Configure Homebrew
+export HOMEBREW_NO_INSECURE_REDIRECT=1
+export HOMEBREW_CASK_OPTS=--require-sha
+export HOMEBREW_DIR=/opt/homebrew
+export HOMEBREW_BIN=/opt/homebrew/bin
# Configure GPG
export GPG_TTY=$(tty)
@@ -45,21 +40,25 @@ export GPG_TTY=$(tty)
PATH="/usr/local/bin:/usr/local/sbin:/sbin:$PATH"
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH:$HOME/.local/bin"
PATH="$PATH:/usr/local/go/bin:$GOPATH/bin"
-PATH="/usr/local/heroku/bin:$PATH"
-PATH="/usr/local/opt/python/libexec/bin:$PATH"
-PATH="/usr/local/opt/sqlite/bin:$PATH"
PATH="$HOME/.cargo/bin:$PATH"
PATH="~/.local/bin:/usr/local/bin:/usr/local/sbin:/sbin:$PATH"
-PATH="$PATH:/usr/local/go/bin:$GOPATH/bin"
PATH="$HOME/.poetry/bin:$PATH"
PATH="/opt/homebrew/bin:$PATH"
command -v pyenv 2>&1 > /dev/null && PATH="$(pyenv root)/shims:${PATH}"
-export PATH="$HOME/.rvm/bin:$PATH"
-export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
+export PATH="$PATH"
export LDFLAGS="-L/usr/local/opt/zlib/lib -L/usr/local/opt/bzip2/lib"
export CPPFLAGS="-I/usr/local/opt/zlib/include -I/usr/local/opt/bzip2/include"
+# Load 1password cli plugins
+op_plugins="$HOME/.config/op/plugins.sh"
+[ -f $op_plugins ] && source $op_plugins
+
+# Load zsh-fast-syntax-highlighting if it exists
+# DEV: brew install zsh-fast-syntax-highlighting
+zfsh=/opt/homebrew/opt/zsh-fast-syntax-highlighting/share/zsh-fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
+[ -f $zfsh ] && source $zfsh
+
# Load in any additional .env files provided
for f in $(find $ZSH_DIR/ -maxdepth 1 -print -type f | grep '\.env\..*\.zsh' | sort)
do
diff --git a/zshrc.d/bootstrap.zsh b/zshrc.d/bootstrap.zsh
index d219eb3..cfc1d98 100644
--- a/zshrc.d/bootstrap.zsh
+++ b/zshrc.d/bootstrap.zsh
@@ -10,13 +10,9 @@ source ${ZSH_DIR}/lib/aliases.sh
# Load in base environment variables
source ${ZSH_DIR}/.env.zsh
+# Load homebrew shell variables
+[ -f /opt/homebrew/bin/brew ] && eval "$(/opt/homebrew/bin/brew shellenv)"
+
# Bootstrap starship
eval "$(starship init zsh)"
-# Load virtualenvwrapper if it exists
-# DEV: Load the lazy script for faster load times
-test -x /usr/local/bin/virtualenvwrapper_lazy.sh && source /usr/local/bin/virtualenvwrapper_lazy.sh
-
-# Load zsh-syntax-highlighting if it exists
-# DEV: brew install zsh-syntax-highlighting
-test -f /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh && source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
diff --git a/zshrc.d/lib/aliases.sh b/zshrc.d/lib/aliases.sh
index ed6e2bd..233bdde 100644
--- a/zshrc.d/lib/aliases.sh
+++ b/zshrc.d/lib/aliases.sh
@@ -8,9 +8,7 @@ alias clear-dns="sudo dscacheutil -flushcache || sudo killall -HUP mDNSResponder
alias reload-history="fc -Ri"
# Docker
-alias docker-login="aws ecr get-login --no-include-email --region us-east-1 | sh"
alias docker-start="open --background /Applications/Docker.app"
-alias docker-top='watch -n 1 "clear && docker top $1"'
# SSH
alias socks-proxy="ssh -D 9050 -C -N ${1}"
diff --git a/zshrc.d/lib/functions.zsh b/zshrc.d/lib/functions.zsh
index c09bbdd..e69de29 100644
--- a/zshrc.d/lib/functions.zsh
+++ b/zshrc.d/lib/functions.zsh
@@ -1,48 +0,0 @@
-# Setup RVM
-rvm () {
- source ${HOME}/.rvm/scripts/rvm
- rvm "$@"
-}
-
-# Setup NVM
-load_nvm () {
- unset -f node npm yarn
- source $(brew --prefix nvm)/nvm.sh
-}
-nvm () {
- load_nvm
- nvm "$@"
-}
-node () {
- load_nvm
- node "$@"
-}
-npm () {
- load_nvm
- npm "$@"
-}
-yarn () {
- load_nvm
- yarn "$@"
-}
-
-
-# Init chef
-chef () {
- eval "$(chef shell-init zsh)"
- chef "$@"
-}
-
-
-# Upgrade functions
-update_spacemacs () {
- cd ~/dotfiles
- git subtree pull --prefix emacs.d --squash --message "Upgrade spacemacs" https://github.com/syl20bnr/spacemacs master
- popd
-}
-
-update_oh_my_zsh () {
- cd ~/dotfiles
- git subtree pull --prefix zshrc.d/oh-my-zsh --squash --message "Upgrade oh-my-zsh" https://github.com/robbyrussell/oh-my-zsh master
- popd
-}