2017-04-24 37 views
2

當我的CSS文件中的行似乎太長(一般屬性,然後一堆值的),我想他們分成幾個新線這樣的(對不起我的低信譽):Emacs的CSS模式將在多行不縮進值,

https://i.stack.imgur.com/bxXvv.png

但我必須手動輸入空格前行,實現這一點。實際上,當我打TAB與我的光標在url行,我所得到的是這樣的:

https://i.stack.imgur.com/r4nxa.png

最糟糕的是,經過手動插入的空間,當我再次打標籤上的同行,由於indent-region,它回到醜陋的格式。

這不是一個顯著的問題,但它確實讓我痛苦,我真的希望我們能在這裏有一個體面的解決辦法。提前致謝!

M-X版本:

GNU Emacs 25.1.1 (x86_64-apple-darwin16.1.0, NS appkit-1504.60 Version 10.12.1 (Build 16B2555)) of 2016-11-27 

編輯: 也試過網絡模式,CSS文件和xah-CSS-模式。他們沒有一個能解決問題。

回答

2

css-mode使用smie縮進。它看起來在該場景中的:被標記爲「:-property」。一種選擇是將css-smie-rules更改爲在該令牌之後包含另一個縮進規則。

評估以下重新定義似乎給你想要的壓痕,

(defun css-smie-rules (kind token) 
    (pcase (cons kind token) 
    (`(:elem . basic) css-indent-offset) 
    (`(:elem . arg) 0) 
    (`(:list-intro . ,(or `";" `"")) t) ;"" stands for BOB (bug#15467). 
    (`(:before . "{") 
    (when (or (smie-rule-hanging-p) (smie-rule-bolp)) 
     (smie-backward-sexp ";") 
     (smie-indent-virtual))) 
    (`(:before . ,(or "{" "(")) 
    (if (smie-rule-hanging-p) (smie-rule-parent 0))) 
    ;; *** Additional rule *** 
    (`(:after . ":-property") css-indent-offset))) 

還有就是命令smie-config-show-indent是有用的,以確定在給定的點正在使用哪些縮進規則。

+0

非常感謝你提出'smie'的東西。沒有你的幫助,我永遠無法知道這種幕後的情況。複製並粘貼你的代碼並不能立即解決問題,但我試圖稍微調整一下這個代碼片段,最終解決問題。你的'smie-config-show-indent'也有很多幫助。謝謝! – tsktsktsk64

+0

當我使用'smie-config-show-indent'時,看起來':-property'從不出現,所有出現的只是':'。這與版本差異有關嗎? – tsktsktsk64

+1

@ tsktsktsk64是的,我剛剛檢查。顯然,這是emacs 25和26之間的一個補充。所以,如果你升級到26(或者只是將新的'css-mode'拉到你的emacs中),上面應該可以工作 – jenesaisquoi

0

@jenesaisquoi提到smie和提供其一個例子是真正有用的。這是我自己問題的最終解決方案。

這些添加到​​文件:

(require 'smie) 
(defun css-smie-rules (kind token) 
    (pcase (cons kind token) 
    (`(:elem . basic) css-indent-offset) 
    (`(:elem . arg) 0) 
    (`(:list-intro . ,(or `";" `"")) t) ;"" stands for BOB (bug#15467). 
    (`(:before . "{") 
    (when (or (smie-rule-hanging-p) (smie-rule-bolp)) 
     (smie-backward-sexp ";") 
     (smie-indent-virtual))) 
    (`(:before . ,(or "{" "(")) 
    (if (smie-rule-hanging-p) (smie-rule-parent 0))) 
    ;; *** Additional rules below *** 
    (`(:after . ":") css-indent-offset) 
    (`(:after . ",") css-indent-offset))) 

的語法是相當自我解釋。

或許還有修改功能,而無需重新編寫它的一些方法,但我不熟悉所有的意見的東西還在,所以如果我找到一個更優雅的方式,我會回來和編輯。

轉到jenesaiquoi的答案,我們現在可以有最好的解決方案。

我在Github中爲web-mode打開了一個問題,web-mode的作者現在正在處理它。我們很快會看到我在問題中提到的縮進的綜合支持。

+0

是否會給你在圖片中的縮進?它不適合我,但我在emacs 26,也許css包已經改變。該規則可能會縮短爲'\'(:。,(或「:」,「)」css-indent-offset)' – jenesaisquoi

+0

@jenesaisquoi說實話,我現在遇到了問題。現在我正在深入解析器,並且......無論如何。我會盡量玩弄,並把它當成一次學習的機會...... – tsktsktsk64