您可以將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-syntax
或defmacro
自己的特殊形式,你可以告訴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")
感謝您的精心解答。我測試了你的lambda例子,然後用兩個空格縮進。看起來我需要改變我的習慣(目前主要是基於clojure)。 –
另一種觀察;當使用Kawa創建java/scheme hybrids(例如Android應用程序)時,兩種方案的標準縮進形式看起來都很糟糕,due.to.really.long.statements。這會導致一個空格縮進,或者編輯器窗口的大部分左側空白都是空白的。看起來不像根據現行計劃慣例很容易解決的問題。 –
我沒有Kawa和類似的經驗,但我相信傳統的答案是在這種情況下與單空間縮進共存。在這一點上,查看其他人的源代碼來找出在該特定社區中被認爲是最佳實踐的東西可能是一個好主意。 – user4815162342