dotemacs/contrapunctus/cp.el
2016-06-12 10:55:57 +05:30

109 lines
4.8 KiB
EmacsLisp

(defun cp-global-set-many-keys (bindings)
"A clean way to define many keys using `global-set-key'.
BINDINGS must be in the form `((,(kbd \"...\") FN) ...)"
(mapc (lambda (b)
(global-set-key (car b) (cadr b)))
bindings))
(defun cp-define-many-keys (keymap bindings)
"A clean way to define many keys using `define-key'.
KEYMAP must be a valid keymap.
BINDINGS must be in the form `((,(kbd \"...\") FN) ...)"
(mapc (lambda (b)
(define-key keymap (car b) (cadr b)))
bindings))
(defun cp-local-set-many-keys (bindings)
"A clean way to define many keys using `local-set-key'.
BINDINGS must be in the form `((,(kbd \"...\") FN) ...)"
(mapc (lambda (b)
(local-set-key (car b) (cadr b)))
bindings))
(require 'cl)
(cl-defun cp-set-keys (&key keymap unset bindings)
"A clean way to set/unset many keybindings.
BINDINGS specifies the functions and the keys they are to be
bound to. It must be an alist in the form -
`((,(kbd \"...\") FN) ...)
If KEYMAP is a symbol `global' or not supplied, the binding is
created by `global-set-key'.
If it is a symbol `local', the binding is created by
`local-set-key'.
Otherwise, it is assumed to be a keymap and the binding is
created with `define-key'.
If UNSET is non-nil, unset keybinds as specified by KEYMAP
instead of setting them. If a keymap is specified, the key is unset
by using define-key to set it to nil in the given keymap -
otherwise, global-unset-key or local-unset-key are used as
applicable."
(let ((key-function (if (not unset)
(pcase keymap
((or `global `nil) #'global-set-key)
(`local #'local-set-key)
(x #'define-key))
(pcase keymap
((or `global `nil) #'global-unset-key)
(`local #'local-unset-key)
(x #'define-key)))))
(if (eq key-function 'define-key)
(if unset
(mapc (lambda (b)
(funcall key-function keymap (car b) nil))
bindings)
(mapc (lambda (b)
(funcall key-function keymap (car b) (cadr b)))
bindings))
(if unset
(mapc (lambda (b)
(funcall key-function (car b)))
bindings)
(mapc (lambda (b)
(funcall key-function (car b) (cadr b)))
bindings)))))
;; ;; tests
;; (progn (cp-set-keys :keymap 'global ; not actually needed, e.g. see next call
;; :bindings `((,(kbd "<f6>") erc) (,(kbd "<f7>") eww)))
;; (and (equal 'erc (lookup-key (current-global-map) (kbd "<f6>")))
;; (equal 'eww (lookup-key (current-global-map) (kbd "<f7>")))))
;; (progn (cp-set-keys :unset t
;; :bindings `((,(kbd "<f6>") erc) (,(kbd "<f7>") eww)))
;; (and (equal nil (lookup-key (current-global-map) (kbd "<f6>")))
;; (equal nil (lookup-key (current-global-map) (kbd "<f7>")))))
;; (progn (cp-set-keys :keymap emacs-lisp-mode-map
;; :bindings `((,(kbd "<f6>") erc) (,(kbd "<f7>") eww)))
;; (and (equal 'erc (lookup-key emacs-lisp-mode-map (kbd "<f6>")))
;; (equal 'eww (lookup-key emacs-lisp-mode-map (kbd "<f7>")))))
;; (progn (cp-set-keys :keymap emacs-lisp-mode-map
;; :unset t
;; :bindings `((,(kbd "<f6>") erc) (,(kbd "<f7>") eww)))
;; (and (equal nil (lookup-key emacs-lisp-mode-map (kbd "<f6>")))
;; (equal nil (lookup-key emacs-lisp-mode-map (kbd "<f7>")))))
;; (progn (cp-set-keys :keymap 'local
;; :bindings `((,(kbd "<f6>") erc) (,(kbd "<f7>") eww)))
;; (and (equal 'erc (lookup-key emacs-lisp-mode-map (kbd "<f6>")))
;; (equal 'eww (lookup-key emacs-lisp-mode-map (kbd "<f7>")))))
;; (progn (cp-set-keys :keymap 'local
;; :unset t
;; :bindings `((,(kbd "<f6>") erc) (,(kbd "<f7>") eww)))
;; (and (equal nil (lookup-key emacs-lisp-mode-map (kbd "<f6>")))
;; (equal nil (lookup-key emacs-lisp-mode-map (kbd "<f7>")))))
(defun cp-get-buffer-regexp (regexp &optional all)
"Returns the name of the first buffer in the buffer list which matches REGEXP.
If ALL is non-nil, multiple matches will be returned as a list."
(let ((results (remove-if-not (lambda (a)
(string-match regexp a))
(mapcar #'buffer-name (buffer-list)))))
(if all results (car results))))
(cl-defun cp-buffer-name-match-p (regexp &optional (string (buffer-name)))
"Checks if STRING matches REGEXP.
If STRING is not provided, uses the current buffer name."
(if (string-match regexp string) t nil))