From d5feff862a0d26f4a9df9246bbfee0576ebcec21 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Mon, 4 Dec 2017 11:55:35 -0800 Subject: [PATCH] Split key binding functionality out into its own file --- lisp/use-package/use-package.el | 3 +- up-bind-key.el | 130 ++++++++++++++++++++++++++++++++ up-core.el | 106 +------------------------- 3 files changed, 133 insertions(+), 106 deletions(-) create mode 100644 up-bind-key.el diff --git a/lisp/use-package/use-package.el b/lisp/use-package/use-package.el index c6ab7d742c6..72a9e1a2250 100644 --- a/lisp/use-package/use-package.el +++ b/lisp/use-package/use-package.el @@ -41,9 +41,10 @@ (require 'up-core) -(require 'up-ensure) +(require 'up-bind-key) (require 'up-diminish) (require 'up-delight) +(require 'up-ensure) (declare-function use-package-jump-to-package-form "up-jump") (autoload #'use-package-jump-to-package-form "up-jump" nil t) diff --git a/up-bind-key.el b/up-bind-key.el new file mode 100644 index 00000000000..1ed760a96bb --- /dev/null +++ b/up-bind-key.el @@ -0,0 +1,130 @@ +;;; up-bind-key.el --- Support for the :bind/:bind-keymap keywords + +;; Copyright (C) 2012-2017 John Wiegley + +;; Author: John Wiegley +;; Maintainer: John Wiegley +;; Created: 17 Jun 2012 +;; Modified: 4 Dec 2017 +;; Version: 1.0 +;; Package-Requires: ((emacs "24.3") (use-package "2.4") (bind-key "2.4")) +;; Keywords: dotemacs startup speed config package +;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; 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 'up-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 + (listify-key-sequence kv))) + (use-package-error + (format "package.el %s failed to define keymap %s" + package keymap-symbol))))) + +(defun use-package-normalize-binder (name keyword args) + (use-package-as-one (symbol-name keyword) args + #'(lambda (label arg) + (unless (consp arg) + (use-package-error + (concat label " a ( . )" + " or list of these"))) + (use-package-normalize-pairs + #'(lambda (k) + (pcase k + ((pred stringp) t) + ((pred vectorp) t))) + #'(lambda (v) (use-package-recognize-function v t #'stringp)) + name label arg)))) + +;;;; :bind, :bind* + +(defalias 'use-package-normalize/:bind 'use-package-normalize-binder) +(defalias 'use-package-normalize/:bind* 'use-package-normalize-binder) + +(defun use-package-handler/:bind + (name keyword args rest state &optional bind-macro) + (cl-destructuring-bind (nargs . commands) + (use-package-normalize-commands args) + (use-package-concat + (use-package-process-keywords name + (use-package-sort-keywords + (use-package-plist-append rest :commands commands)) + state) + `((ignore + (,(if bind-macro bind-macro 'bind-keys) + :package ,name ,@nargs)))))) + +(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* + +(defalias 'use-package-normalize/:bind-keymap 'use-package-normalize-binder) +(defalias 'use-package-normalize/:bind-keymap* 'use-package-normalize-binder) + +(defun use-package-handler/:bind-keymap + (name keyword arg rest state &optional override) + (use-package-concat + (use-package-process-keywords name rest state) + `((ignore + ,@(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)))) arg))))) + +(defun use-package-handler/:bind-keymap* (name keyword arg rest state) + (use-package-handler/:bind-keymap name keyword arg rest state t)) + +(provide 'up-bind-key) diff --git a/up-core.el b/up-core.el index b4d86971b9b..687aac21030 100644 --- a/up-core.el +++ b/up-core.el @@ -7,7 +7,7 @@ ;; Created: 17 Jun 2012 ;; Modified: 29 Nov 2017 ;; Version: 2.4 -;; Package-Requires: ((emacs "24.3") (bind-key "2.4")) +;; Package-Requires: ((emacs "24.3")) ;; Keywords: dotemacs startup speed config package ;; URL: https://github.com/jwiegley/use-package @@ -39,7 +39,6 @@ ;;; Code: -(require 'bind-key) (require 'bytecomp) (require 'cl-lib) @@ -737,20 +736,6 @@ If RECURSED is non-nil, recurse into sublists." (prog1 (let ((ret (use-package-normalize-pairs key-pred val-pred name label x t))) - ;; Currently, the handling of keyword arguments by - ;; `use-package' and `bind-key' is non-uniform and - ;; undocumented. As a result, `use-package-normalize-pairs' - ;; (as it is currently implemented) does not correctly handle - ;; the keyword-argument syntax of `bind-keys'. A permanent - ;; solution to this problem will require a careful - ;; consideration of the desired keyword-argument interface - ;; for `use-package' and `bind-key'. However, in the - ;; meantime, we have a quick patch to fix a serious bug in - ;; the handling of keyword arguments. Namely, the code below - ;; would normally unwrap lists that were passed as keyword - ;; arguments (for example, the `:filter' argument in `:bind') - ;; without the (not (keywordp last-item)) clause. See #447 - ;; for further discussion. (if (and (listp ret) (not (keywordp last-item))) (car ret) @@ -812,49 +797,6 @@ representing symbols (that may need to be autloaded)." (use-package-non-nil-symbolp (cdr x)) (cdr x))) nargs))))) -(defun use-package-normalize-binder (name keyword args) - (use-package-as-one (symbol-name keyword) args - #'(lambda (label arg) - (unless (consp arg) - (use-package-error - (concat label " a ( . )" - " or list of these"))) - (use-package-normalize-pairs - #'(lambda (k) - (pcase k - ((pred stringp) t) - ((pred vectorp) t))) - #'(lambda (v) (use-package-recognize-function v t #'stringp)) - name label arg)))) - -;;;###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 - (listify-key-sequence kv))) - (use-package-error - (format "package.el %s failed to define keymap %s" - package keymap-symbol))))) - (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 @@ -1005,52 +947,6 @@ deferred until the prefix key sequence is pressed." (t (use-package-error "The :catch keyword expects 't' or a function"))))) -;;;; :bind, :bind* - -(defalias 'use-package-normalize/:bind 'use-package-normalize-binder) -(defalias 'use-package-normalize/:bind* 'use-package-normalize-binder) - -(defun use-package-handler/:bind - (name keyword args rest state &optional bind-macro) - (cl-destructuring-bind (nargs . commands) - (use-package-normalize-commands args) - (use-package-concat - (use-package-process-keywords name - (use-package-sort-keywords - (use-package-plist-append rest :commands commands)) - state) - `((ignore - (,(if bind-macro bind-macro 'bind-keys) - :package ,name ,@nargs)))))) - -(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* - -(defalias 'use-package-normalize/:bind-keymap 'use-package-normalize-binder) -(defalias 'use-package-normalize/:bind-keymap* 'use-package-normalize-binder) - -(defun use-package-handler/:bind-keymap - (name keyword arg rest state &optional override) - (use-package-concat - (use-package-process-keywords name rest state) - `((ignore - ,@(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)))) arg))))) - -(defun use-package-handler/:bind-keymap* (name keyword arg rest state) - (use-package-handler/:bind-keymap name keyword arg rest state t)) - ;;;; :interpreter (defun use-package-handle-mode (name alist args rest state) -- 2.39.2