2010-12-10 81 views
2

我正在尋找一種方法來模仿Textmate在Emacs中的CSS編輯行爲。Emacs css模式自動關閉大括號和冒號後自動插入分號(ala Textmate)

在TextMate中,添加CSS屬性時:

#element {} <-- Braces auto close. 
#element {background: ;} <-- after typing the colon, the semi-colon is automatically inserted and the cursor is placed between them. 

我已經採取了看看幾款CSS-模式(和textmate.el),但看不到任何人實施了這一點。

我的Emacs Lisp語言絕對零知識會願意給它一個鏡頭,寫自己的東西,但沒有人知道,如果這已經做了?

+0

自動完成屬性名稱後插入冒號和分號也很舒服! – smonff 2016-12-06 14:30:25

回答

3

您想查看electric函數的一些示例(在輸入特定可見字符時執行附加輸入或格式化時使用的命名約定)。

沒有什麼特別的實施。問題的關鍵是在模式的鍵盤映射中綁定到執行工作的功能。除了必須處理輸入的字符的插入之外,它就像任何其他的鍵綁定一樣。

cc-mode有幾個例子。其基本做法是這樣的:

(define-key c-mode-base-map "{" 'c-electric-brace) 

(defun c-electric-brace (arg) 
    (interactive "*P") 
    ;; [...] 
    (self-insert-command (prefix-numeric-value arg)) 
    ;; [...] 
) 

不可否認C-電梅開二度比你可能期待一個更爲複雜的功能,但它是微不足道的具有簡單地插入相同數量的}個功能在插入{之後。

(defun my-electric-brace (arg) 
    "Automatically add a closing '}' for every '{' inserted." 
    (interactive "*P") 
    (let ((count (prefix-numeric-value arg))) 
    (self-insert-command count) 
    (save-excursion 
     (insert-char ?} count)))) 

(defun my-css-mode-hook() 
    (local-set-key (kbd "{") 'my-electric-brace)) 

(add-hook 'css-mode-hook 'my-css-mode-hook) 

但是,您可能會發現這有點過分簡單,並且有些情況下您不希望插入匹配大括號。通過定義電子刪除功能,您可能還希望在刪除其中一個時自動處理刪除的大括號。

您的電子冒號要求也不如支架那麼簡單,因爲它只能出現在正確的環境中(儘管在實踐中您可能會失去一個天真的實現,因爲我不認爲您會在冒號中輸入冒號這是不正確的上下文中的CSS文件。)

希望這點你在正確的方向,如果你決定寫自己的解決方案。

很明顯,你會想讀一些教程上elisp的,但對於理解上面的代碼,只要注意,您可以使用章˚Fdescribe-function)來讀取文檔的任何elisp的功能(或的Mxfind-function到查看代碼)。

+0

謝謝你這樣詳細的解釋 – prevailrob 2010-12-11 10:09:37

1

對於各種括號通用自行配對,等你可能想看看autopair-mode

+0

這是一個非常全面的解決方案。 – phils 2010-12-11 11:28:43

相關問題