3 (defun require?
(feature)
5 (condition-case err
(require (if (stringp feature
)
6 (intern feature
) feature
))
8 (lwarn :require?
:warning
"[require %s]: %s" feature err
)
10 (condition-case err
(load-library (format "%s" feature
))
12 (lwarn :require?
:warning
"[load-library %s]: %s" feature err
)
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
)))
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
)
28 (require? may-require
)
30 (apply function args
))
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."
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
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
)
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
)