加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

跟我学习GNU Emacs - 12

发布时间:2020-12-15 21:06:28 所属栏目:大数据 来源:网络整理
导读:? 4.3 C和C++支持 如果打开后缀名是“.c”、“.h”、“.y”(用在yacc语法方面)或“.lex”(lex定义文件)的文件,Emacs就会自动进入C语言编辑模式,简称C模式。如果打开后缀名是“.C”、“.H”、“.cc”、“.hh”、“.cpp”、“.cxx”、“.hxx”、“.c++”、

?

4.3 C和C++支持

如果打开后缀名是“.c”、“.h”、“.y”(用在yacc语法方面)或“.lex”(lex定义文件)的文件,Emacs就会自动进入C语言编辑模式,简称C模式。如果打开后缀名是“.C”、“.H”、“.cc”、“.hh”、“.cpp”、“.cxx”、“.hxx”、“.c++”、“.h++”的文件,Emacs就会自动进入C++语言编辑模式,简称C++模式。还可以利用“M-x c-mode RET”命令把任意文件手动地放到C模式里。类似地,“c++ - mode”命令将把编辑缓冲区放到C++模式里。

C模式和C++模式是用同一个Emacs LISP程序包实现的,它的名字是“cc-mode”;除了这两种语言编辑模式,该程序包还提供一个与用在NextStep环境里的Objective-C语言相对应的编辑模式。C模式能够识别和理解ANSI C语法和“古老的”Kernighan-Ritchie C语法。虽然我们的介绍以C模式为主,但他们全都适用于C++模式。C++模式只比C模式额外多出很少几项功能。

顺便说一句,Emacs的Perl语言编辑模式(这种语言由于广泛应用于WWW服务器的程序设计中而正变得越来越流行)是从C模式的一个老版本演化而来的。如果你使用的程序设计语言是Perl,就会发现C模式里的光标移动命令、锁进命令和排版命令等都能原封不动地应用到Perl模式里。唯一需要变化的就是得把命令名中的“c-”前缀改为“perl-”。Emacs会在遇到后缀名为“.pl”的文件时自动启动Perl模式。

在C模式里,Emacs能够识别和理解本章前面提到的各种语言学元素。语句中的分号(;)、冒号(:)、逗号(,)、花括号({和})以及井号(#,用在C语言的预处理器命令中)等字符都是自动缩进的。也就是说,输入这些字符的时候,Emacs将自动对当前行进行缩进。

?

4.3.1 Motion Commands

??? 除了以单词、句子等语言元素为单位进行移动的Emacs标准命令(这些命令在C模式里的用武之地,可以说只剩下大段的注释了)之外,C模式还另外准备了一些能够以语句、函数以及预处理器条件为单位进行移动的高级命令。我们把C模式这些高级的移动命令汇总在表4-2里。

?

?

Table 4-2. Advanced C motion commands

Keystrokes

Command name

Action

M-a

c-beginning-of-statement

Move to the beginning of the current statement.

M-e

c-end-of-statement

Move to the end of the current statement.

M-q

c-fill-paragraph

If in comment,fill the paragraph,preserving indentations and decorations.

C-M-a

beginning-of-defun

Move to the beginning of the body of the function surrounding the point.

C-M-e

end-of-defun

Move to the end of the function.

C-M-h

c-mark-function

Put the cursor at the beginning of the function,the mark at the end.

C-c C-q

c-indent-defun

Indent the entire function according to indentation style.

C-c C-u

c-up-conditional

Move to the beginning of the current preprocessor conditional.

C-c C-p

c-backward-conditional

Move to the previous preprocessor conditional.

C-c C-n

c-forward-conditional

Move to the next preprocessor conditional.

?

?

请注意,以语句为单位的移动命令其按键绑定与Emacs的backward-sentenceheforward-sentence命令的完全相同。事实上,在C语言的注释里,他们的使用效果完全相同。

类似地,“M-q”正是原来的fill-paragraph命令:只不过C模式把它的功能扩大为能够保留语句开头的缩进和前导字符而已。举个例子,如果光标位于下面这段注释的某个任意位置:

/* This is 
 
 * a
 
 * comment paragraph with wildly differing right
 
 * margins.
 
 * It goes on     for a while,* then stops.
 
 */


 

?

那么,按下“M-q”组合键时,他将变成下面这样:

?

/* This is a comment paragraph with wildly differing right margins.
? * It goes on for a while,then stops. */

?

如果不得不通读别人的大段代码以对之进行调试或者修改,就会发现以预处理器条件为单位的移动命令是一种上帝的恩赐。当面对的代码是准备运行在多种系统(Emacs就是一个这样的软件)上的时候,情况就更是如此;对于这种情况,你最需要答案的问题是:“到底有哪些代码是真正会被编译的?”

有了“C-c C-u”命令,就能立即找出某行代码具体是由哪一个预处理器条件控制的。请看下面的例子:

?

#define LUCYX

#define BADEXIT -1



#ifdef LUCYX

    ...

    *ptyv = open ("/dev/ptc",O_RDWR | O_NDELAY,0);

    if (fd < 0)

        return BADEXIT;

    ...

#else

    ...

    fprintf (stderr,"You can't do that on this system!");

    ...

#endif
假设代码里的省略号(…)都代表上百行代码,而现在需要找出文件/dev/ptc在什么条件下才会被打开。于是,把光标移到这一行上并按下“C-c C-u”组合键,光标将移动到“#ifdef LUCYX”语句处:表示他只有在LUCYX系统上时才会被编译。如果想跳过不会被编译的代码,而直接到达这个编译条件的结尾,请按下“C-c C-n”组合键。
C语言中的语句分隔符和语句块分隔符被绑定为一组不仅能正确插入字符、还能正确缩进有关语句的命令上。这些字符是走花括号“{”和右花括号“}”、分号“;”和冒号“:”(用来分隔switch语句的标号)。比如,如果准备结束一个语句块或者一个函数体,就可以按下LINEFEED(或RETURN)和“;”;Emacs将把它和与他配对的“{”对齐,也就不用再去查看前面的代码以确定那个“{”到底是在哪一列上了。
“}”是一种括号字符,所以Emacs会在输入“}”的时候“闪现”与他配对的“{”。如果配对的“{”不在窗口所显示的文本范围内,Emacs就将把包含“{”的那条语句显示在辅助输入区里;如果那一行除“{”外只有空白(即空格或制表符)、Emacs会先显示一个“^J”(即“C-j”或LINEFEED字符),然后把下一行显示出来,这是为了让用户更好地把握“{”字符处的上下文。
我们再去看看前面给出的“times”函数的例子,假设准备在这个函数的结尾输入一个“}”字符,而这个函数体开始位置上的“{”字符已经不再屏幕上了。因为在左花括号“{”所在的那一行上没有其他的代码,所以输入“}”后会在辅助输入区里看到如下所示的内容:
Matches {^J  int i;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读