论坛首页 综合技术论坛

Programming in Emacs Lisp笔记(六) Narrowing and Widening

浏览 2697 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-28  

Narrowing and Widening

Narrowing是Emacs的一项功能,它使你可以将焦点集中在缓冲区的某个部分上,而不用担心意外的修改了其它部分。Narrowing通常被禁用,因为它可能会使新手觉得迷惑。

Narrowing的优点

使用narrowing时,缓冲区的其它部分不可见,看起来就像其它部分不存在一样。利用这点你可以只在缓冲区中的某个部分进行查找或替换操作,而不会影响缓冲区的其它部分。narrow-to-region被绑定到C-x n n。

narrowing将使缓冲区的其它部分不可见,如果用户在无意中执行了narrowing命令时他们有可能会认为其它部分被删除了。而且,在这里 用undo命令也不(C-x u)也不能关闭narrowing。这时可以使用widen(C-x n w)命令让其它部分重新显示出来。

Narrowing对于Lisp解释器或者用户都是很有用的。Emacs Lisp函数通常被设计为工作于缓冲区的一部分,或者工作于被narrow处理的整个缓冲区。比如:what-line函数(这个函数存在narrow时 将显示两两个行号narrowing情况时的行数和非narrowing时的行数),从缓冲区中移除narrowing,工作完成后恢复 narrowing。另一个函数count-lines,它被what-line调用,它使用narrowing将工作范围限定在需要处理的区域,在处理 完成后再恢复。

特殊的save-restriction表(form)

在Emacs Lisp中,可以使用save-restriction保持对所有narrowing操作的跟踪。当Lisp解释器遇到save-restriction 时,它执行save-restriction语句的body部分,然后撤消在body部分代码执行中的所有narrowing相关的操作。比如:缓冲区当 前是narrowed状态,save-restriction中的代码删除了narrowing,save-restriction返回时将回到 narrorwed的状态。在what-line命令中,所有的narrowing缓冲区都可能被save-restriction后面的widen命令 撤消。所有原始的narrowing将在函数完成后被恢复。

使用save-restriction语句的简单模板如下:

(save-restriction
body... )

save-restriction函数的body部分是一个或多个将被依序执行的语句。

注意:同时使用save-excursion和save-restriction时,应该将save-excursion放在外部。如果放反了顺 序,就有可能使Emacs在调用save-excursion后无法记录当前的narrowing信息。因此,这两个函数同时使用应该写成下面的结构:

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

如果这两个函数不紧挨在一起,也必须按顺序使用:

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

what-line

what-line命令告诉你当前光标所在行的行号。这个命令个使用了save-restriction和save-excursion函数的例子。函数如下:

(defun what-line ()
"Print the current line number (in the buffer) of point."
(interactive)
(save-restriction
(widen)
(save-excursion
(beginning-of-line)
(message "Line %d"
(1+ (count-lines 1 (point)))))))
这个函数有一个文档字符串和交互语句。接下来的两行使用了save-restriction和widen。

save-restriction将在其body部分的代码执行完后恢复narrowing。

save-restriction下面的widen撤消调用what-line时缓冲区中的所有narrowing(这些narrowing就 save-restriction所记录的那些)。widen使得可以从缓冲区的开始位置计数。否则,它将只能对可访问区域进行计数。在save- restriction执行完成后将恢复原来的narrowing。

widen后面是save-excursion语句,它将保存当前光标位置(mark point等),在执行完成后恢复。在save-excursion的body部分使用了beginning-of-line函数移动poing。

注意:这里的widen语句在save-restriction和save-excursion之间。当同时使用时save-excursion应该在最外面。

what-line函数的最后两行用于统计缓冲区中的行数,并显示在回显区。

(message "Line %d"
(1+ (count-lines 1 (point)))))))
message函数在Emacs回显区显示了一行消息。第一个参数是一个双引号单间的字符串。字符串中可以包含%d,%s或%c来打印参数。%d用于打印数字。

所打印的数字%d是最后一行函数计算出来的:

(1+ (count-lines 1 (point)))
它从缓冲区中的第一行统计,从1开始计数直到(poing),并在这个数字上加1。(1+是一个自增加1的函数。)这里加1是因为在第2行的前面只有一行,count-lines计数时只计算到当前所在行的前一行。

在count-lines执行完后,将显示消息在回显区,save-excrusion恢复point和mark;save-restriction恢复原来的narrowing。

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics