diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2007-07-10 19:54:43 +0000 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2007-07-10 19:54:43 +0000 |
commit | 6911eed4623481ad2821490741bedf95e953b61a (patch) | |
tree | 8a84931610162b74117fee8de326ac01903d377c /lisp/subr.el | |
parent | 9d6d740bb4fd6039f021952ac17f3ff3c664e98d (diff) | |
download | emacs-6911eed4623481ad2821490741bedf95e953b61a.tar.gz |
*** empty log message ***
Diffstat (limited to 'lisp/subr.el')
-rw-r--r-- | lisp/subr.el | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/lisp/subr.el b/lisp/subr.el index 3804624b0b9..185b9031d27 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -510,6 +510,7 @@ Don't call this function; it is for internal use only." (if (integerp b) (< a b) t) (if (integerp b) t + ;; string< also accepts symbols. (string< a b)))))) (dolist (p list) (funcall function (car p) (cdr p)))) @@ -2485,6 +2486,29 @@ If BODY finishes, `while-no-input' returns whatever value BODY produced." (or (input-pending-p) ,@body)))))) +(defmacro condition-case-no-debug (var bodyform &rest handlers) + "Like `condition-case' except that it does not catch anything when debugging. +More specifically if `debug-on-error' is set, then it does not catch any signal." + (declare (debug condition-case) (indent 2)) + (let ((bodysym (make-symbol "body"))) + `(let ((,bodysym (lambda () ,bodyform))) + (if debug-on-error + (funcall ,bodysym) + (condition-case ,var + (funcall ,bodysym) + ,@handlers))))) + +(defmacro with-demoted-errors (&rest body) + "Run BODY and demote any errors to simple messages. +If `debug-on-error' is non-nil, run BODY without catching its errors. +This is to be used around code which is not expected to signal an error +but which should be robust in the unexpected case that an error is signalled." + (declare (debug t) (indent 0)) + (let ((err (make-symbol "err"))) + `(condition-case-no-debug ,err + (progn ,@body) + (error (message "Error: %s" ,err) nil)))) + (defmacro combine-after-change-calls (&rest body) "Execute BODY, but don't call the after-change functions till the end. If BODY makes changes in the buffer, they are recorded @@ -2519,6 +2543,20 @@ The value returned is the value of the last form in BODY." ;;;; Constructing completion tables. +(defun complete-with-action (action table string pred) + "Perform completion ACTION. +STRING is the string to complete. +TABLE is the completion table, which should not be a function. +PRED is a completion predicate. +ACTION can be one of nil, t or `lambda'." + ;; (assert (not (functionp table))) + (funcall + (cond + ((null action) 'try-completion) + ((eq action t) 'all-completions) + (t 'test-completion)) + string table pred)) + (defmacro dynamic-completion-table (fun) "Use function FUN as a dynamic completion table. FUN is called with one argument, the string for which completion is required, @@ -2540,10 +2578,7 @@ that can be used as the ALIST argument to `try-completion' and (with-current-buffer (let ((,win (minibuffer-selected-window))) (if (window-live-p ,win) (window-buffer ,win) (current-buffer))) - (cond - ((eq ,mode t) (all-completions ,string (,fun ,string) ,predicate)) - ((not ,mode) (try-completion ,string (,fun ,string) ,predicate)) - (t (test-completion ,string (,fun ,string) ,predicate))))))) + (complete-with-action ,mode (,fun ,string) ,string ,predicate))))) (defmacro lazy-completion-table (var fun) ;; We used to have `&rest args' where `args' were evaluated late (at the |