跟我学习GNU Emacs - 11

来源:互联网 发布:工商管理硕士就业知乎 编辑:程序博客网 时间:2024/05/01 15:58

 

4.2 编写代码

如果打算用Emacs来编写代码,那么可以利用Emacs针对某种程序设计语言的编辑模式来帮助更有效率地完成任务。针对程序设计语言的编辑模式能够把Emacs从根本上改造成一个“语法指导的”或“语言敏感的”(即能够识别和理解某种程序设计语言的语法的)编辑器,从而帮助用户按自己的风格写出格式整齐、方便阅读的代码。Emacs为很多种程序设计语言准备有相应得编辑模式。

Emacs还支持程序的运行和调试工作。Emacs还为很多种编译器和UNIX操作系统的make命令提供了一个功能强大的接口:Emacs可需要为此写两行代码,第一行代码使用autoload函数,其作用是告诉Emacs在遇到没有见过的命令时应该到什么地方去查他。这就在函数和实现函数的程序包之间建立起一个关联关系:这样,当这个函数第一次被调用时,Emacs就会自动加载相应的程序包来载入该函数的代码。具体到我们的例子,需要在一个用来启动某种语言编辑模式的函数和把实现该编辑模式的程序包之间建立起关联关系。Autolaod函数的格式如下所示:

(autoload ‘function “filename” “description” t)

 

注意“function”前面的单引号和“filename”两端的双引号;Ada程序员可把下面这条语句添加到“.emacs”文件里:

 

(autoload ‘ada-mode “ada-mode”“ada editing mode.” t)

 

这条语句的作用是让Emacs在第一次调用ada-mode函数的时候加载ada程序包。

 

在看第二行代码,它将在源代码文件的后缀名和用来启动对应编辑模式的函数之间建立起一个关联关系;这样,当访问一个带用给定后缀名的文件时,那个用来启动对应编辑模式的函数将被自动调用执行。这需要用到Emacs全局变量auto-mode-alist。Emacs将根据这个列表中的关联关系,把被访问的文件放到与它的后缀名相对应的编辑模式里。下面是一个为ada-mode创建这种关联关系的例子,Emacs将把后缀名是“.a”的文件都放到这个编辑模式里。

(setq auto-mode-alist(cons ‘(“\\.a $” . ada-mode) auto-mode-alist))

 

运行LISP代码将在用户打开一个后缀表明它是用某种编程语言写的源代码文件时,引发下述一连串事件。假设准备访问的文件是“pgm.a”: 首先,Emacs读入这个文件,接着,它发现auto-mode-alist里有一个与文件名后缀“.a”对应的设置项,于是试图调用与之关联的ada-mode函数。他注意到函数ada-mode并不存在。但找到了一个把该函数与ada程序包关联起来的autoload设置项。于是,Emacs将加载这个程序包,从中找到ada-mode命令,然后运行这个命令。经过这样一番周折之后,编辑缓冲区就被设置为ada-mode编辑模式。如果把刚才介绍的那两行代码放到了“.emacs”文件里,Emacs就能在今后所有的编辑工作中识别出所使用的程序设计语言。

 

 

4.2.1 语法

不同的语言编辑模式在具体功能方面当然是有区别的,但它们都支持相同的基本概念。其中最重要的一点是,不同的语言编辑模式都能识别和理解与之对应的程序设计语言的语法,即能够识别和理解该语言的字符、词汇和某些语法现象。我们已经见识过Emacs在人类语言语法现象方面的“学问”了。在对普通文字材料做编辑处理的时候,Emacs能够知道单词、句子和段落都是怎么一回事:他允许以这些语言学元素为单位,来移动光标或者删除文本。它还知道某些标点符号的正确用法,例如括号:只要一输入右括号,他就会“闪现”与之配对的左括号—把光标移到那里停一秒钟再返回来。这为检查括号的配对情况是否正确提供了方便。

Emacs对程序设计语言语法的了解,与他在人类语言语法方面的情况差不多。总的来说,它能够识别和理解以下一些基本的语言元素:

l       Words—对多数程序设计语言来说就是标识符和数字。

l       Punctuation(标点符号)—包括操作符(如”+”, “-”, “<”,“>”等)和语句分隔符(如分号“;”)。

l       字符串—由字符组成的序列,通常放在一组配对的分隔符(比如引号)里。

l       括号—包括方括号(“[”和“]”)、花括号(“{”和“}”)和普通的圆括号。

l       空白—比如空格和制表符、用来分隔其他语言元素,通常不具备语言学方面的含义。

l       注释—被括在注释分隔符之间的字符序列,不同的语言有不同的注释分隔符(比如C语言中“/*”和“*/”)

 

    Emacs把语法信息保存在各种“语法表”(syntax tables)里,类似于把按键绑定信息保存在键位映射图里的情况,Emacs有一个供全体编辑缓冲区使用的全局语法表,每个编辑缓冲区再有一个局部语法表,局部语法表会随编辑缓冲区所处的编辑模式而变化。此外,程序设计语言编辑模式还能识别和理解依赖于具体语言的更复杂的语言学概念,比如语句、语句块、函数、子例程和LISP中S-表达式等等。

原创粉丝点击