emacs中cc-mode的缩进配置方法详解

emacs中cc-mode的缩进配置方法详解

    emacs的初学者首先应该用到的就是语法高亮和代码缩进配置了,代码缩进的配置一般来讲是使用cc-mode。网上有不少已经配置好的配置文件,但这些配置文件中所设置的代码缩进风格并不一定适用于每个人。而对于如何配置缩进,资料比较少。我就自己的配置文件详细解释一下。
    首先要说几个关于缩进的概念,cc-mode关于缩进有几个部分:
    全局的基本设置:
c-basic-offset:设置缩进的基本单位,2字符,4字符等。
tab-width:设置一个tab键的缩进字符。
c-default-style:在没有相关匹配的style时默认调用的style。
    cc-mode中可以设置自己的style,缩进风格就是在此设置,然后style配置完成之后应该将你的style加入到对应的hook中,所谓hook就是对应于不同语言的不同的缩进”钩子“。cc-mode中常用的有两种,一个是c-initialization-hook,另一个是c-mode-common-hook。这两个hook都是全局的,而对应于不同的语言会有不同的特殊hook,如下:
— Variable: c-mode-hook
— Variable: c++-mode-hook
— Variable: objc-mode-hook
— Variable: java-mode-hook
— Variable: idl-mode-hook
— Variable: pike-mode-hook
— Variable: awk-mode-hook
   
名字显而易见,不同的语言有着不同的hook。
    cc-mode进行代码缩进的原理就是对程序语言进行一定的语义分析,然后对语言中不同的标签可以进行不同的缩进设置,这些缩进标签就对应于c-offsets-alisit。对于代码缩进的多少,cc-mode有如下规定:
One of the symbols +, -, ++, --, *, or /

These special symbols describe a relative offset in multiples of c-basic-offset:

By defining a style's indentation in terms of c-basic-offset, you can change the amount of whitespace given to an indentation level while maintaining the same basic shape of your code. Here are the values that the special symbols correspond to:

+         c-basic-offset times 1
-        c-basic-offset times -1
++      c-basic-offset times 2
--    c-basic-offset times -2
*        c-basic-offset times 0.5
/        c-basic-offset times -0.5
    下面这个快捷键非常有用:C-c C-s。它是查看当前光标所在处的缩进标签的,举个例子:
    if (a > 0)
        {
            a = 3;
        }
      你想让这两个括号与if同列,那么就可以把光标放在那个”{"上,然后按C-c C-s,emacs会显示它的缩进标签:(substatement-open xxx)。好了,那么你就知道这个缩进所对应的cc-mode标签是substatement-open,然后你就可以在你的style中设置这个substatement-open变量了。就这个例子而言,现在它的值应该是+,即缩进一个基本单位。按照你的要求,将它设置为0即可。即加入:(substatement-open . 0)。
    或者还有一种更为直接的方式,cc-mode的Manual把它称为是交互式设置,就是直接在光标所在处使用快捷键C-c C-o,然后它就会让你设置这个点所对应的变量,直接输入+、-、++、--、/、*即可完成设置。设置完成后,可以用C-c C-q来查看缩进效果。不过这种方式好像在emacs重启之后会失效,所以还是建议定义自己的style。
    众所周知,不同的代码风格如linux和bsd、K&R对于括号的放置位置也是有不同的,这个对就于变量c-hanging-braces-alist。有了上面那些知识,就可以根据你自己不同的代码风格用C-c C-s查看不同的标签后开始设置你自己的缩进风格了,下面开始定义自己的style:
;;Create MyCppStyle
(defconst MyCppStyle
'((c-tab-always-indent . t)
    (c-comment-only-line-offset . 0)
        (c-hanging-braces-alist . ((substatement-open after)
                                              (brace-list-open)))
        (c-cleanup-list . (comment-close-slash
                                 compact-empty-funcall))
    (c-offsets-alist . ((substatement-open . 0)
                                                (innamespace . 0)                           ;;在namespace中不缩进
                                                (case-label      . +)                          ;;case标签缩进一个c-basic-offset单位
                                                (access-label . -)                             ;;private/public等标签少缩进一单位
                                                (inline-open . 0)                             ;;在.h文件中写函数,括号不缩进
                                                (block-open     . 0)))                       ;;在一个新块开始时不缩进
;;    (c-echo-syntactic-information-p t)
        (setq comment-start "/*"
                  comment-end "*/")
    (setq indent-tabs-mode nil))
    "My Cpp Coding Style")
(c-add-style "MyCppStyle" MyCppStyle)                   ;;定义完自己的style,将其添加到cc-mode的style中。
;;Define own hook
(defun MyCppHook ()
(company-mode)
(setq indent-tabs-mode nil)
(setq global-hl-line-mode t)
(c-set-style "MyCppStyle"))                                   ;;设置这个hook对应于MyCppStyle
(add-hook 'c++-mode-hook 'MyCppHook)                ;;将此hook应用于所有的c++模式。
    最后,可以设置对于不同的文件绑定不同的模式,可以用以下语句实现:
;;set *.h and *.c and *.cpp files use c++ mode
(setq auto-mode-alist
      (cons '("" . c++-mode) auto-mode-alist))
(setq auto-mode-alist
      (cons '("" . c++-mode) auto-mode-alist))
(setq auto-mode-alist
      (cons '("" . c++-mode) auto-mode-alist))
   至此,缩进模式配置完毕。上面这些配置对应的缩进风格如下图:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值