Imported sources
[vee.git] / core-fun.el
blob977be2187890425e3d1bd0a3b73d036255e753c0
1 (require 'cl)
3 (defun require? (feature)
4 (or (featurep feature)
5 (condition-case err (require (if (stringp feature)
6 (intern feature) feature))
7 (error
8 (lwarn :require? :warning "[require %s]: %s" feature err)
9 nil))
10 (condition-case err (load-library (format "%s" feature))
11 (error
12 (lwarn :require? :warning "[load-library %s]: %s" feature err)
13 nil))))
15 ;;; FIXME potencial bug, use cl-macs functions to get keyword arguments
16 (defun funcall! (function &rest args)
17 "`funcall' FUNCTION. Keywords: :may-require :or-value"
18 (let (may-require or-value)
19 (mapc (lambda (key-var)
20 (let ((key-tail (memq (car key-var) args)))
21 (when key-tail
22 (setq args (reverse (set-difference args
23 (subseq key-tail 0 2))))
24 (set (cadr key-var) (cadr key-tail)))))
25 '((:may-require may-require) (:or-value or-value)))
26 (or (and (or (fboundp function)
27 (and may-require
28 (require? may-require)
29 (fboundp function)))
30 (apply function args))
31 or-value)))
33 (defun autoload-iff (function file &optional docstring interactive type)
34 "set autoload if file found. FILE has found."
35 (and (symbolp file) (setq file (symbol-name file)))
36 (and (locate-library file)
37 (autoload function file docstring interactive type)))
39 (defmacro enable-mode (&rest modes)
40 `(mapc (lambda (m) (funcall m 1))
41 ',(mapcar (lambda (m) (intern (format "%s-mode" m))) modes)))
43 (defmacro disable-mode (&rest modes)
44 `(mapc (lambda (m) (funcall m -1))
45 ',(mapcar (lambda (m) (intern (format "%s-mode" m))) modes)))
47 (defun def-keys (keymap &rest bindings)
48 "Define key-bindings in KEYMAP."
49 (let (key fun)
50 (while bindings
51 (setq key (pop bindings))
52 (setq fun (pop bindings))
53 (define-key keymap (if (stringp key) (read-kbd-macro key) key)fun))))
55 (defmacro defsecrets (name file)
56 "Define a wrapper around NAME secrets defined in FILE.
57 A variable named NAME must be defined in FILE with the same form as `let*'s
58 VARLIST.
60 FILE can be either an string or a symbol to be required."
61 `(defmacro ,name (name &rest forms)
62 ,(format "`let*' wrapper for `%s' variable" name)
63 (require? ,file)
64 (let ((info (assoc (eval name) ,name)))
65 (if info `(let* ((name ,(car info)) ,@(cdr info)) ,@forms)
66 `(lwarn name :warning "No secrets for %s" ,name) nil))))
68 (provide 'vee/core-fun)