2012-09-14 81 views
1

默認情況下,在Emacs方案模式中使用一個空格縮進代碼格式:Emacs的方案(方案模式)壓痕

(string-append 
"foo " 
"bar " 
"baz") 

我希望它至少有兩個空間,即:

(string-append 
    "foo " 
    "bar " 
    "baz") 

對於Emacs中的大多數模式,這很容易改變,但我還沒有想出如何爲方案做到這一點。我也查看了scheme.el的源代碼,雖然在那裏有邏輯來做各種奇特的對齊操作,但我還沒有找到自定義「標準縮進」的簡單方法。

回答

7

您可以將lisp-indent-offset設置爲2,但您幾乎肯定不想這樣做,除非您真的知道自己在做什麼。

Lisp風格的語言堅持與其他語言略有不同的縮進哲學。當S-表達式的第一個元件的開括號後是單獨,慣例是排隊剩餘的元素在同一列開始:

(first-item 
second-item 
third-item fourth-item fifth-item 
sixth-item) 

當第二元件是在與在同一行第一個,該公約是使以下元素的第二個:不屬於特殊形式

(first-item second-item 
      third-item fourth-item fifth-item 
      sixth-item) 

本公約適用於sexps,包括功能調用string-append調用此類。評估人員和編譯人員特別解釋的特殊表格,sexps遵循略微不同的縮進。提供表達式來評估的表格將與兩個空格縮進:

(lambda (value) 
    (display value) 
    (send-eof)) 

有經驗利斯佩爾,兩個空間巧妙地表示該表達的一種特殊形式,其兩個空間縮進子表單將按順序進行評價。當您使用define-syntaxdefmacro自己的特殊形式,你可以告訴Emacs的縮進其子窗體以同樣的方式:

;; define a CL-style `unless` macro... 
(defmacro unless (test &rest forms) 
    `(or ,test (progn ,@forms))) 

;; ...and tell emacs to indent its body forms with two spaces 
;; (unless (= value 0) 
;; (display value) 
;; (send-eof)) 
(put 'unless 'lisp-indent-function 2) 

更改縮進級別將錯誤信號發送到正在發生的事情的讀者,減損從你的代碼。如果你不喜歡的Emacs如何縮進您的來電string-append,我建議切換到第二種形式,它會自動縮進進一步字符串向右:

(string-append "foo " 
       "bar " 
       "baz") 
+0

感謝您的精心解答。我測試了你的lambda例子,然後用兩個空格縮進。看起來我需要改變我的習慣(目前主要是基於clojure)。 –

+0

另一種觀察;當使用Kawa創建java/scheme hybrids(例如Android應用程序)時,兩種方案的標準縮進形式看起來都很糟糕,due.to.really.long.statements。這會導致一個空格縮進,或者編輯器窗口的大部分左側空白都是空白的。看起來不像根據現行計劃慣例很容易解決的問題。 –

+0

我沒有Kawa和類似的經驗,但我相信傳統的答案是在這種情況下與單空間縮進共存。在這一點上,查看其他人的源代碼來找出在該特定社區中被認爲是最佳實踐的東西可能是一個好主意。 – user4815162342

0

在壓痕款式多樣是問題的根源。因此,儘管Emacs模式通常會嘗試支持大多數現有的縮進樣式,但它們並不一定能夠輕鬆地使用不同的樣式,因爲這會鼓勵人們創造新的樣式。一般來說,學習使用「標準」縮進樣式會更好:這將幫助您閱讀其他人的代碼並幫助其他人閱讀您的代碼。