2012-03-22 79 views
4

我在Emacs的cc-mode中工作,我發現縮進非常非常惱人。Emacs縮進功能

作爲一名VIM用戶,我非常習慣更長的縮進,以及儘可能多地按下Tab鍵以實現標籤的奢華。

在Emacs中,我的TAB映射到goto-line。首先,哪個函數是爲了縮進當前行而設計的(或者是什麼點)?由於您需要突出顯示該區域,因此很煩人。

二,什麼是修復縮進的最佳方法?

謝謝

+1

正常情況下TAB被綁定到縮進當前行的c-indent-line-or-region;它可以在你陳述的時候多次命中(只有第一個有效)。您是否使用重新綁定TAB鍵的init文件?請注意,c-c,c-q縮進了當前的功能。另外alt-x,describe-bindings顯示了當前的模式鍵綁定。 – 2012-03-23 02:00:46

回答

8

你可以看到的是什麼樣的黏合目前使用的與M-x describe-variable RET c-indentation-style(但是作爲文檔狀態,請不要直接設置此變量,而不是使用M-x c-set-style )。

變量c-basic-offset是什麼控制互聯在cc-mode其默認爲set-from-style這意味着互聯將從什麼C風格的你與M-x set-c-style設置可以讓你從一組built-in styles選擇繼承(見下文)或者你可以create your own style。您可以看到如何使用M-x describe-variable RET c-style-alist定義樣式,然後您可以將其中一個用作M-x c-add-style的模板。

  • GNU - 自由軟件基金會的GNU計劃的C代碼得天獨厚的編碼風格。
  • k & r - 用於C代碼的經典Kernighan和Ritchie風格。
  • bsd - 在Eric Allman之後也被稱爲「Allman style」。
  • whitesmith - 通過與早期商業C編譯器Whitesmiths C一起提供的示例進行推廣。
  • stroustrup - C++代碼的經典Stroustrup風格。
  • ellemtel - 「C++編程規則和建議」中定義的流行C++編碼標準,Erik Nyquist和Mats Henricson,Ellemtel^1。
  • linux - 針對Linux(內核)的C編碼標準。
  • python - Python擴展模塊的C編碼標準^ 2。
  • java - 編輯Java代碼的風格。請注意,當您輸入java-mode時,c-default-style的默認值會安裝此樣式。
  • awk - 編輯AWK代碼的樣式。請注意,當您輸入awk模式時,c-default-style的默認值會安裝此樣式。
  • 用戶 - 這是您創建的特殊風格。它由所有樣式變量的出廠默認值組成,您可以使用自定義界面進行自定義修改,也可以在您的.emacs文件頂層編寫setqs和c-set-offset(請參閱「配置基礎」)。樣式系統創建此樣式作爲其初始化的一部分,並且之後不進行修改。

UPDATE:

也有人建議使用標籤鑰匙插入\t製表符,但請不要製表符力插入!作爲StackOverflow的創建者之一說"only a moron would use tabs to format their code"。現在這有些苛刻,但值得注意的是,即使兩個最大的對手GoogleMicrosoft也同意這一點(即使他們默認推薦不同數量的空間)。

Google says

僅使用空間,並且每次縮進2個空格。

Microsoft says

製表符(\ 0×09)不應該在代碼中使用。所有縮進 應使用4個空格字符完成。

另外,emacswiki在Tabs are Evil上有一節。

So, go forth and untabify

0

答案是:(setq-default c-basic-offset <value>)

-2

我也喜歡emacs,但無法忍受它試圖爲我管理標籤。所以,我用我的.emacs如下:

(global-set-key "\r" 'newline-and-indent) 
(global-set-key "\C-m" 'newline-and-indent) 
(global-set-key "\C-j" 'newline) 

(defalias 'backward-delete-char-untabify 'backward-delete-char) 
(defun indent-according-to-mode() (interactive) 
    (save-excursion 
    (goto-char (- (line-beginning-position) 1)) 
    (search-backward-regexp "^[   ]*") 
) 
    (if (eq (point) (line-beginning-position)) 
    (insert (match-string 0)) 
    (save-excursion 
     (goto-char (line-beginning-position)) 
     (insert (match-string 0)) 
    ) 
) 
) 

(defun newline-and-indent() (interactive) (newline) (indent-according-to-mode)) 
(defun lisp-indent-line() (interactive) (insert "  ")) 
; Is there a way to fix this without a hook? 
(defun my-c-hook() 
    (setq c-electric-flag nil) 
    (defun c-indent-command (n) (interactive "*") (insert "  "))) 
(add-hook 'c-mode-common-hook 'my-c-hook) 
(defun my-perl-hook() 
    (defun perl-electric-terminator() (interactive "*") (self-insert-command 1)) 
    (defun perl-indent-command() (interactive "*") (insert "  "))) 
(add-hook 'perl-mode-hook 'my-perl-hook) 
(defun indent-for-tab-command() (interactive "*") (insert " ")) 

產生的行爲:TAB鍵純粹是要插入一個製表符,按進入副本從當前行的確切前導空格(空格或製表符)到新行,並且這些模式下的所有特殊凹痕行爲都被禁用。如果您使用其他語言,您可能需要擴展/修改上述內容以添加鉤子。

注意:在上面,大多數引號中的空格實際上是文字標籤。如果它不能通過SO並複製/粘貼,你可能需要自己手動修復它。

+0

這聽起來不錯!但在使用它之前,我不明白你的最後一張紙條。在我真正使用它之前,請您解釋一下嗎?此外,這是否保持'setq-default c-basic-offset'調用的大小爲4的縮進?大括號怎麼樣?這是否處理他們? – darksky 2012-03-23 01:47:31

+0

此代碼禁用* all *自動縮進,但複製前一行的前導空白。您必須按下標籤或空格鍵才能獲得所需的縮進。我的注意事項是,不是使用'\ t'或任何製表符的轉義符,我在上面的代碼中編寫了文字標籤(在引號內),我不確定它們是否能夠在複製和粘貼後繼續存在。 .. – 2012-03-23 02:39:18

+0

@R ..請不要強制插入製表符!正如StackOverflow的創建者之一所說[「只有白癡纔會使用製表符來格式化他們的代碼」](http://www.codinghorror.com/blog/2009/04/death-to-the-space-infidels.html )。現在這有點苛刻,但值得注意的是,即使是兩個最大的競爭對手[Google](http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Spaces_vs._Tabs)和[Microsoft] (http://blogs.msdn.com/b/brada/archive/2005/01/26/361363.aspx),就這一點達成一致(即使他們默認推薦不同數量的空格)。 – aculich 2012-03-23 14:46:20