我在Emacs的cc-mode
中工作,我發現縮進非常非常惱人。Emacs縮進功能
作爲一名VIM用戶,我非常習慣更長的縮進,以及儘可能多地按下Tab鍵以實現標籤的奢華。
在Emacs中,我的TAB映射到goto-line
。首先,哪個函數是爲了縮進當前行而設計的(或者是什麼點)?由於您需要突出顯示該區域,因此很煩人。
二,什麼是修復縮進的最佳方法?
謝謝
我在Emacs的cc-mode
中工作,我發現縮進非常非常惱人。Emacs縮進功能
作爲一名VIM用戶,我非常習慣更長的縮進,以及儘可能多地按下Tab鍵以實現標籤的奢華。
在Emacs中,我的TAB映射到goto-line
。首先,哪個函數是爲了縮進當前行而設計的(或者是什麼點)?由於您需要突出顯示該區域,因此很煩人。
二,什麼是修復縮進的最佳方法?
謝謝
你可以看到的是什麼樣的黏合目前使用的與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
的模板。
UPDATE:
也有人建議使用標籤鑰匙插入\t
製表符,但請不要製表符力插入!作爲StackOverflow的創建者之一說"only a moron would use tabs to format their code"。現在這有些苛刻,但值得注意的是,即使兩個最大的對手Google和Microsoft也同意這一點(即使他們默認推薦不同數量的空間)。
僅使用空間,並且每次縮進2個空格。
製表符(\ 0×09)不應該在代碼中使用。所有縮進 應使用4個空格字符完成。
另外,emacswiki在Tabs are Evil上有一節。
答案是:(setq-default c-basic-offset <value>)
我也喜歡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並複製/粘貼,你可能需要自己手動修復它。
這聽起來不錯!但在使用它之前,我不明白你的最後一張紙條。在我真正使用它之前,請您解釋一下嗎?此外,這是否保持'setq-default c-basic-offset'調用的大小爲4的縮進?大括號怎麼樣?這是否處理他們? – darksky 2012-03-23 01:47:31
此代碼禁用* all *自動縮進,但複製前一行的前導空白。您必須按下標籤或空格鍵才能獲得所需的縮進。我的注意事項是,不是使用'\ t'或任何製表符的轉義符,我在上面的代碼中編寫了文字標籤(在引號內),我不確定它們是否能夠在複製和粘貼後繼續存在。 .. – 2012-03-23 02:39:18
@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
正常情況下TAB被綁定到縮進當前行的c-indent-line-or-region;它可以在你陳述的時候多次命中(只有第一個有效)。您是否使用重新綁定TAB鍵的init文件?請注意,c-c,c-q縮進了當前的功能。另外alt-x,describe-bindings顯示了當前的模式鍵綁定。 – 2012-03-23 02:00:46