`

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

阅读更多

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。

评论

相关推荐

    Programming in Emacs Lisp

    Programming in Emacs Lisp英文版

    An Introduction to Programming in Emacs Lisp

    - **标题**:“An Introduction to Programming in Emacs Lisp”(Emacs Lisp编程入门) - **描述**:该资源是基于Emacs官方文档的重编版本,旨在提供更易阅读的字体样式。 #### 知识点详解 ##### 1. Emacs Lisp...

    An Introduction to Programming in Emacs Lisp Second Edition

    - **标题**:“An Introduction to Programming in Emacs Lisp Second Edition” - **描述**:本书是关于Emacs Lisp编程的入门教程,被誉为“经典中的经典”。 该书由Robert J. Chassell撰写,由自由软件基金会出版...

    Robert Chassell:An Introduction to Programming in Emacs Lisp

    ### Robert Chassell:An Introduction to Programming in Emacs Lisp #### 知识点概览 - **Lisp Lists**: 介绍Lisp列表的概念及其在Emacs Lisp中的应用。 - **Lisp Atoms**: 解释Lisp原子的基本概念以及它们在...

    An Introduction to Programming in Emacs Lisp [3.10].chm

    An Introduction to Programming in Emacs Lisp [3.10].chm

    GNU Emacs Lisp编程入门(文本org)

    Programming in Emacs Lisp: An Introduction (美)Robert J.Chassell 著 毛文涛、吕芳 译 洪峰 审校 本书的作者罗伯特·卡塞尔是自由软件基金会的合创人之一,也是理查德·斯托曼博士青年时期结交的挚友,他...

    GNU Emacs Lisp编程入门

    GNU Emacs Lisp编程入门(清晰版) 英文名:An Introduction to Programming in Emacs Lisp

    GNU Emacs Lisp 编程入门

    GNU Emacs Lisp 编程入门是一本非常专业的编程书籍,它详细地介绍了如何使用GNU Emacs Lisp这种编程语言来编写程序。GNU Emacs Lisp是一种用于GNU Emacs编辑器的编程语言,它是一种功能强大且灵活的编程工具,广泛...

    Atom-language-emacs-lisp,emacs lisp和yasnippet支持atom和github。.zip

    在“Atom-language-emacs-lisp.zip”这个压缩包中,主要关注的是对Emacs Lisp的支持。Emacs Lisp是一种用于扩展和定制GNU Emacs编辑器的Lisp方言。它提供了丰富的API和交互式编程环境,使得开发者可以编写自定义的...

    Programming-in-Emacs-LISP.pdf.rar_LISP PDF_emacs lisp_emacs lisp

    GNU emacs Lisp manual This is a very interesting text, useful to write and program in several languages. Emacs is a editor made in Lisp, a artificial intelligence language.

    GNU EMACS lisp编程入门.djvu

    GNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvu

    gnu emacs lisp 编程入门

    本书的英文版原名是《Programming in Emacs Lisp: An Introduction》,由自由软件基金会出版,享有复制与分发的权限。机械工业出版社在2001年5月出版了中文版,ISBN为7-111-08862-6。书籍的定价为38.00元,并承诺如...

    GNU Emacs Lisp Reference Manual For Emacs Version 22.1 Revision 2.9, April 2007

    ### GNU Emacs Lisp 参考手册知识点总结 #### 1. 引言 GNU Emacs Lisp 参考手册为Emacs版本22.1提供了详细的指导,该版本为修订版2.9,发布于2007年4月。该手册由Bil Lewis、Dan LaLiberte、Richard Stallman以及...

    emacs-lisp编程入门

    Emacs Lisp(简称Elisp)是GNU Emacs编辑器的核心编程语言,它允许用户自定义、扩展和控制这个功能丰富的文本编辑器。作为一个强大的脚本语言,Elisp在程序员和Emacs爱好者中广受欢迎,不仅适合初学者,也满足高级...

    emacs lisp introduction

    6. **缩小范围和扩大范围(Narrowing and Widening)**:介绍了如何限制和扩展缓冲区中可见的部分,这对于编辑大型文件非常有用。 7. **ar, dr, ons: 基本函数(Fundamental Functions)**:探讨了一些核心函数,这些...

Global site tag (gtag.js) - Google Analytics