我也用了,但是经常捕捉会丢失,是怎么回事呢? (defun 111() (error-init (list '("cmdecho" 0 "osmode" 0 ) 1 )) ...... (error-restore) ) (defun error-init (lst / ss varl untag reset bar) (if (= 1 (logand 1 (getvar "pickfirst"))) (progn (setq ss (ssgetfirst)) (if (not (apply 'or ss)) (setq ss nil)) ) ) (mapcar 'set '(varl untag reset bar) lst) (setq $lt-alive$ (if (not $lt-alive$) 1 (1+ $lt-alive$))) (if (and (> $lt-alive$ 1) (= "*LTErr*" (last $lt-error$)) ) (progn (setq *error* lt:error $lt-alive$ 1) (error-restore) (setq $lt-alive$ 1) ) ) (if (<= $lt-alive$ 0) (progn (setq $lt-alive$ 0) (error-restore) (setq $lt-alive$ 1) ) ) (if (= $lt-alive$ 1) (progn (setq $lt-olderror$ *error*) (if (or (not (listp $lt-error$)) (/= "*LTErr*" (last $lt-error$)) ) (setq $lt-error$ (list "*LTErr*")) ) (if (or (= (type (car $lt-error$)) 'list) (= "*LTErr*" (car $lt-error$)) ) (setq $lt-error$ (cons untag $lt-error$)) (setq $lt-error$ (cons untag (cdr $lt-error$))) ) (if untag (lt:undo-init T) (setq $lt-undoctl$ nil) ) ) ) (sysvar-set (car lst)) (if (= $lt-alive$ 1) (progn (setq *error* lt:error) (if reset (setq $lt-error$ (append (reverse (cdr (reverse $lt-error$))) (list reset (last $lt-error$)) ) ) ) ) ) (if ss (apply 'sssetfirst ss)) ) (defun error-restore () (setq $lt-alive$ (1- $lt-alive$) $lt-error$ (cons (car $lt-error$) (reverse (cons (last $lt-error$) (cddr (reverse (cdr $lt-error$))) ) ) ) ) (if (>= $lt-alive$ 0) (lt:sysvar-restore) (setq $lt-varlist$ nil) ) (if (<= $lt-alive$ 0) (progn (lt:undo-restore) (if $lt-olderror$ (setq *error* $lt-olderror$ $lt-olderror$ nil)) ) ) (if (null $zhl_os)(setq $zhl_os 767)) (if $zhl_os (setvar "osmode" $zhl_os)) (princ) ) (defun sysvar-set (lst / lst3 a n b lst2) (setq lst3 (car $lt-varlist$) n -2) (repeat (/ (length lst) 2) (setq a (strcase (nth (setq n (+ n 2)) lst)) b (nth (1+ n) lst) lst2 (append lst2 (list (list a (getvar a)))) ) (if (and $lt-varlist$ (not (assoc a lst3))) (setq lst3 (append lst3 (list (list a (getvar a))))) ) (setvar a b) ) (if $lt-varlist$ (setq $lt-varlist$ (append (list lst3) (cdr $lt-varlist$) (list lst2))) (setq $lt-varlist$ (list lst2)) ) ) (defun lt:undo-restore (/ x) (if $lt-undoctl$ (progn (defun x (i val) (= (logand i val) i)) (sysvar-set '("cmdecho" 0)) (while (= 8 (logand 8 (getvar "undoctl"))) (command "_.undo" "_end")) (if (/= $lt-undoctl$ (getvar "undoctl")) (progn (cond ((= 0 $lt-undoctl$) (command "_.undo" "_control" "_none")) ((x 2 $lt-undoctl$) (command "_.undo" "_control" "_one")) ) (if (x 4 $lt-undoctl$) (command "_.undo" "_auto" "_on")) ) ) (if (not (x 2 (getvar "undoctl"))) (lt:sysvar-restore)) (setq $lt-undoctl$ nil) ) ) ) (defun lt:undo-init (varset / x y z) (defun x () (getvar "undoctl")) (defun y (i) (= (logand i (x)) i)) (sysvar-set '("cmdecho" 0)) (setq z (x)) (if (or (= (x) 0) (= (x) 16)) (command "_.undo" "_all")) (if (or (not (y 1)) (y 2)) (command "_.undo" "_control" "_all")) (if (y 4) (command "_.undo" "_auto" "_off")) (while (y 8) (command "_.undo" "_end")) (while (not (y 8)) (command "_.undo" "_begin")) (lt:sysvar-restore) (if (= varset T) (setq $lt-undoctl$ z) z) ) (defun lt:sysvar-restore (/ lst) (if (<= $lt-alive$ 0) (setq lst (car $lt-varlist$) $lt-varlist$ (list lst)) (setq lst (last $lt-varlist$)) ) (mapcar '(lambda (x) (apply 'setvar x)) lst) (setq $lt-varlist$ (reverse (cdr (reverse $lt-varlist$)))) ) |