6.1 特殊形式 save-restriction

在Emacs Lisp中,你可以使用特殊形式 save-restriction 来追踪当前是否存在缩小范围的情况。当Lisp解释器遇到 save-restriction 时,它会执行 save-restriction 表达式体中的代码,然后撤销代码引起的任何缩小范围的更改。例如,如果缓冲区被缩小,而跟在 save-restriction 后面的代码消除了缩小,则 save-restriction 将在之后将缓冲区恢复到缩小的区域。在 what-line 命令中,由 save-restriction 命令后立即执行的 widen 命令会撤销缓冲区可能存在的任何缩小。任何原始的缩小在函数完成之前都会被恢复。

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

(save-restriction
  body… )

save-restriction 的体是一个或多个将由Lisp解释器按顺序评估的表达式。

最后,需要注意的一点是:当你同时使用 save-excursionsave-restriction,并且它们紧跟在彼此之后时,应该将 save-excursion 放在最外层。如果你以相反的顺序编写它们,可能无法记录Emacs在调用 save-excursion 后切换到的缓冲区的缩小。因此,在一起编写时,save-excursionsave-restriction 应该像这样编写:

(save-excursion
  (save-restriction
    body…))

在其他情况下,当它们没有一起编写时,save-excursionsave-restriction 特殊形式必须按照适合函数的顺序编写。

例如,

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