6.1 save-restriction 特殊形式

在 Emacs Lisp 中,可使用 save-restriction 特殊形式记录当前生效的缩窄状态。当 Lisp 解释器遇到 save-restriction 时,会执行其主体内的代码,之后撤销代码对缩窄状态造成的任何修改。例如缓冲区已缩窄,而 save-restriction 后的代码取消了缩窄,save-restriction 会在之后恢复原有缩窄区域。在 what-line 命令中,save-restriction 之后紧跟的 widen 命令会取消缓冲区缩窄,而原始缩窄状态会在函数结束前恢复。

save-restriction 表达式的模板很简单:

(save-restriction
  body... )

save-restriction 的主体是一个或多个表达式,由 Lisp 解释器依次执行。

最后需要注意:若同时使用 save-excursionsave-restriction,应将 save-excursion 放在外层。若顺序相反,可能无法记录调用 save-excursion 后 Emacs 切换到的缓冲区的缩窄状态。因此,两者一起使用时应如下编写:

(save-excursion
  (save-restriction
    body...))

在其他不一起使用的场景中,save-excursionsave-restriction 需根据函数需求确定顺序。

For example,

  (save-restriction
    (widen)
    (save-excursion
    body...))