首页 > 代码库 > emacs 定制进缩风格

emacs 定制进缩风格

纵览

emacs 文档中描述,进缩风格实现只需要两步:第一步,根据内容与上下文找到对应的进缩风格的类别;第二步,依据进缩风格决定的表达式锚点的进缩偏移。下面我们对 cc-mode 风格定制加以说明。

进缩风格的类别

比如在 C 代码中,使用 C-c . 然后再使用两次 tab ,就可以出现多个内置风格供选择,每种风格对进缩偏移做了或多或少的设定,不尽相同,才表现出了不同的进缩风格。

进缩偏移

进缩偏移,就是对变量进行设定产生的。有两个十分重要的变量

c-basic-offset
c-offsets-alist

这是前者的详细,是一个普通的整数值;后者的详细说明在这里,这是一个关联列表,存储了语法符号与偏移量的键值对,使用

c-set-offset

对其中的元素进行修改,下面给出了如下修改这些语法符号相关联的偏移量的方式,

  (setq c-basic-offset 4)  (c-set-offset ‘substatement-open 0)  (c-set-offset ‘arglist-intro ‘+)  (c-set-offset ‘arglist-cont-nonempty ‘+)  (c-set-offset ‘statement-case-intro ‘+)  (c-set-offset ‘case-label 0)  (c-set-offset ‘statement-case-open 0)

关于其中的“+”,在此处有很详细的说明,无非就是对 c-basic-offset 变量的值进行加减乘除,也就一个“+”,就代表偏移1倍 c-basic-offset ,在此处就是 4 。另外,语法符号名称众多,我们没有必要统统掌握,如果需要进缩某条给定的语句,但是我们不知道其语法符号的名称,在相关行上使用 C-c C-s 就可以知道其语法符号的名称,再做相应修改即可。

风格举例

  (setq c-basic-offset 4)  (c-set-offset ‘substatement-open 0)  (c-set-offset ‘statement-case-intro ‘+)  (c-set-offset ‘case-label 0)  (c-set-offset ‘statement-case-open 0)

上面的风格可以达到如下的效果,

    switch (a)    {    case 1:        break;    default:        break;    }

完整的代码如下

(defun my-c-mode-hook ()  (setq c-basic-offset 4)  (c-set-offset ‘substatement-open 0)  (c-set-offset ‘statement-case-intro ‘+)  (c-set-offset ‘case-label 0)  (c-set-offset ‘statement-case-open 0))(add-hook ‘c-mode-common-hook ‘my-c-mode-hook)

定义自己的风格名称

我们肯定有这样的需求,在不同的项目中使用不同的编码风格,还得 emacs 中的内置风格不能满足需求,可以自定义多种不同的风格,推荐使用这里的方式,简而言之就是采用修改内置风格的方式自定义,省时省力,

(defun my-c-mode-hook ()  (c-add-style "ownstyle" ‘(                "k&r"                (c-basic-offset . 4))))(add-hook ‘c-mode-common-hook ‘my-c-mode-hook)

只是把 k&r 中的基本进缩量修改为 4 ,其他的样式与 k&r 风格一致。这样重启 emacs ,打开 C 文件,使用 C-c . TAB TAB 就可以看见 ownstyle 了。