2011-07-27 121 views
3

我想將縮進模式設置爲僅製表符,任何模式都有4個字符寬度。這看起來很平凡,但我還沒有成功。每種模式似乎都有自己的變量和選項。我已經嘗試過爲Perl和R做這件事,但沒有成功。 事情都沒有奏效:Emacs縮進級別全局覆蓋

(setq-default tab-width 4) 
(setq standard-indent 4) 
(setq-default r-indent-level 4) 
(setq perl-indent-level 4) 

(setq C-基本偏移4)適用於C模式,但沒有別的。我忘記了什麼嗎?我設置了錯誤的變量嗎?有沒有這樣的選擇?

我每天都使用各種語言(R,Perl,sh,C/C++等)。由於我喜歡跨語言使用相同的縮進,是否有這樣一個全局覆蓋變量可以設置,以便縮進級別和樣式在所有模式中保持一致?如果沒有,有沒有辦法在啓動時爲每種模式設置它們?如果一切都失敗了,必須有一個elisp腳本來做到這一點。

使用Emacs 23


解決:我不得不單獨設置變量每個模式,因爲沒有這樣的全局覆蓋。您可以將以下語句放入〜/ .emacs文件中以在啓動時配置emacs。

R模式來自ESS包。通過文檔閱讀,我發現這一點:(setq ess-indent-level 4)

在CPerl模式(setq cperl-indent-level 4)

看起來你只需要尋找在每種模式下正確的變量。

回答

5

Emacs中的縮進並不是一件「微不足道的事情」。你可以在Emacs的維基閱讀所有關於它:
http://www.emacswiki.org/emacs/CategoryIndentation

任何主要的模式是自由地實現壓痕但是它希望,正如你已經注意到了,其中幾人介紹壓痕相關的變量;所以不,沒有全局縮進配置保證影響每一種可能的主要模式(儘管在實踐中,某些變量按照慣例是完全標準的)。

如果不是,有沒有辦法在啓動時爲每種模式設置它們?

當然。最簡單的方法是配置使用的MxcustomizeRET接口值和默認值,雖然只用defcustom定義的變量出現在那裏,所以它不一定是全面的(但它仍然是非常有用的用於瀏覽一些可用的設置,即使您沒有真正使用它來設置值)。

如你所做的那樣,在初始化文件中使用setqsetq-default設置值(或者在自動緩衝區局部變量的情況下是默認設置)也沒問題。

如果你想要更多的控制,你可以使用模式鉤子。幾乎每種模式都在初始化緩衝區後運行分配給(mode-name)-hook變量的函數列表,因此任何特定於模式的自定義都可以寫入elisp函數中,並添加到init文件中相應的鉤子列表中。

例如爲:

(defun my-c-mode-config() 
    (whitespace-mode 1) 
    (setq indent-tabs-mode t 
     tab-width  4 
     c-basic-offset 4)) 

(add-hook 'c-mode-hook 'my-c-mode-config) 
4

使用變量standard-indent。你可以在啓動文件中設置它,或者自定義它;它在縮進組中。請執行M-x customize,然後選擇編輯,然後縮進;或者,做M-x customize-group indent

至於使用製表符而不是空格縮進,您只需要將indent-tabs-mode設置爲t即可。它的定製方式也是一樣。

1

(setq default-tab-width 2)對我的作品在Emacs 24