几个月前我编写了一些带有很多if
语句的代码。如果region-active-p
,如果beginning-of-line
,诸如此类的事情。
在了解了cond
lisp 之后,我想知道我是否可以大大改进我的代码。
问题是,据我所知,这cond
只是在“真实”时才做的事情,而我实际上需要back-to-indentation
在这些检查之间移动。
为了正确跳过最后一个子句,我什至必须设置变量值。
(defun uncomment-mode-specific ()
"Uncomment region OR uncomment beginning of line comment OR uncomment end"
(interactive)
(let ((scvar 0) (scskipvar 0))
(save-excursion
(if (region-active-p)
(progn (uncomment-region (region-beginning) (region-end))
(setq scskipvar 1))
(back-to-indentation)) ; this is that "else" part that doesn't fit in cond
(while (string= (byte-to-string (following-char)) comment-start)
(delete-char 1)
(setq scskipvar 1))
(indent-for-tab-command)
(when (= scskipvar 0)
(search-forward comment-start nil t)
(backward-char 1)
(kill-line))
)))
)
所以基本上我的问题是,在检查另一个子句之前,我有点想对一个子句不“真实”给出一些后果。这可能吗?如果没有,最好的办法是什么?
编辑:由于我们将此作为解决方案的示例案例,因此我将其写下来以便更容易理解。
如果区域处于活动状态,请从区域中删除评论。如果没有,将点移至意向。
只要后面的字符是注释字符,就删除它。然后,缩进这一行。
如果它没有执行上述任何操作,请向前搜索注释字符,然后终止该行。