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

转载地址:

http://hi.baidu.com/susdisk/blog/item/b33a6bcaf6d24e4cf21fe78a.html


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 '("
\\.h$" . c++-mode) auto-mode-alist))
(setq auto-mode-alist
      (cons '("
\\.c$" . c++-mode) auto-mode-alist))
(setq auto-mode-alist
      (cons '("
\\.cpp$" . c++-mode) auto-mode-alist))
   至此,缩进模式配置完毕。上面这些配置对应的缩进风格如下图:

猜你喜欢

转载自blog.csdn.net/feidouqwer/article/details/7294139
今日推荐