其实Undo处理对程序来说也是非常重要的,尤其对有较多输出的复杂程序而言,不能解决Undo问题,使用起来会极不方便。
对于Undo问题的解决,一种方法是尽量少用或不用command函数,即不调用原始命令,这是一种较好的方法,但必须注意的是,一段程序必须至少有一次调用command函数,否则Undo命令将取消程序运行前的前一次命令,解决的方法是在程序运行的起始位置加一个无谓的command,如“(command "color" "")”。
有时不使用command函数不能达到我们要求的一些功能,或使得程序过于复杂,我们可能需要使用一些command函数(原始命令),这是就应该在程序中进行Undo处理,即使用Undo命令的编组功能。
例五是一段程序出错函数与Undo处理的示例。
************************************************
;;例五
(defun newerr (s) ;出错函数
(if s
(progn
(term_dialog) ;使用对话框时使用
(if olderr (setq *error* olderr)) ;出错函数恢复
(if oldvar (setvar ... oldvar)) ;系统变量恢复
(if olderr (setq *error* olderr)) ;出错函数恢复
(command "_.undo" "_e") ;Undo编组结束
)
)
(princ)
)
(defun c:my(/ ...) ;主程序(主函数)
(setvar "cmdecho" 0) ;取消命令回显提示
(command "_.undo" "_BE") ;Undo编组开始
(setq olderr *error* *error* newerr) ;调用自定义出错函数
(setq oldvar (getvar ...)) ;保存相关系统变量
(setvar ... ;设置系统变量
... ;程序段
...
(setvar ... oldvar) ;恢复系统变量
(setq *error* olderr) ;恢复出错函数
(command "_.undo" "_E") ;结束Undo命令编组
(princ) ;取消程序返回值
)
************************************************