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))
   至此,縮進模式配置完畢。上面這些配置對應的縮進風格如下圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章