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-excursion
和 save-restriction
,并且它们紧跟在彼此之后时,应该将 save-excursion
放在最外层。如果你以相反的顺序编写它们,可能无法记录Emacs在调用 save-excursion
后切换到的缓冲区的缩小。因此,在一起编写时,save-excursion
和 save-restriction
应该像这样编写:
(save-excursion (save-restriction body…))
在其他情况下,当它们没有一起编写时,save-excursion
和 save-restriction
特殊形式必须按照适合函数的顺序编写。
例如,
(save-restriction (widen) (save-excursion body…))